У меня есть мок на метод, который при вызове должен бросить ошибку- по какой-то причине он не работает. Но когда в поля добавляю еще один точно такой же мок - у меня отрабатывают те замоканные методы и тест успешно проходит. Почему так может происходить?
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. Вызываю только один тестовый метод. Названия классов изменены с целью конфендециальности.