solovladys
@solovladys
Люблю программировать

Почему проходит тест только при объявленных двух моках одного типа (один не используется)?

У меня есть мок на метод, который при вызове должен бросить ошибку- по какой-то причине он не работает. Но когда в поля добавляю еще один точно такой же мок - у меня отрабатывают те замоканные методы и тест успешно проходит. Почему так может происходить?

class SomeTestClass{
    @Mock
    private SomeServiceImpl serviceMock;
    //@Mock
    //private SomeServiceImpl serviceMock2; //тест начинает корректно работать

    @Spy
    private MyFileTransformer fileTransformerSpy;
    @Spy
    private MyFileViewTransformer fileViewTransformerSpy;

    @InjectMocks
    private TargetService service = new TargetService();

    @BeforeEach
    void setup() {
        MockitoAnnotations.initMocks(this);
    }
       @Test
        void given_when_then() {
            MockMultipartFile multipartFileMock = new MockMultipartFile("fileData",
                    "fileName",
                    "text/plain",
                    new byte[]{});
            MyFile fileTransformed = new MyFile();

            when(fileTransformerSpy.convert(multipartFileMock)).thenReturn(fileTransformed);
            when(serviceMock.saveFile(fileTransformed)).thenThrow(new RuntimeException());

            assertThrows(RuntimeException.class,
                    () -> targetService.saveFile(multipartFileMock, 1L)); // ошибка из второго мока не бросилась
            
            verifyZeroInteractions(fileViewTransformerSpy); //падает, так как не сработал мок и вызвался ненужный в данном случае метод
        }
}


тестируемый метод:
@Override
    public FileInfoView saveFile(MultipartFile file, Long category) {
        if (file == null) {
            throw new MyException("Can't find file to save!");
        }
        MyFile fileInfo = fileTransformer.convert(file, category);

        try {
            MyFile myFile = service.saveFile(fileInfo); // должно упасть на этом моменте
            return fileViewTransformer.convert(myFile);
        } catch (Exception e) {
            throw new MyException(e.getMessage());
        }
    }


PS: Использую junit 5. Вызываю только один тестовый метод. Названия классов изменены с целью конфендециальности.
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
@AndreyBell
Возможно, забыт второй аргумент category в этой строке
when(fileTransformerSpy.convert(multipartFileMock)).thenReturn(fileTransformed);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект