Ваш тест аннотирован: @Test(expected = Exception.class)
Это означает, что тест будет пройден, если Exception
(или любой подкласс) поднимется до верхнего уровня. Это происходит в первой строке вашего теста:
firstService.hz();
Вот почему он проходит. К сожалению, это исключение означает, что остальная часть вашего теста никогда не запускается, так как это исключение распространяется вверх и за пределы вашего метода теста.
Немного некрасиво, но этот фрагмент делает то, что вы хотите:
@Test
public void hz() throws Exception {
try {
firstService.hz();
// If we get here, then we didn't throw an exception - fail
Assert.fail();
} catch (Exception ex) {
// Exception was expected - disregard and continue
// no-op
}
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
verify(secondService).handleErrorMessage(argumentCaptor.capture());
String value = argumentCaptor.getValue();
assertEquals("message", value);
}
Вышеприведенный метод запускает ваш метод и перехватывает исключение (и завершается ошибкой, если вы не получили ожидаемое исключение). Затем он продолжается и запускает оставшуюся часть теста.
JUnit 5 предоставляет немного более чистый способ, но вам придется выполнить миграцию:
@Test
public void hz() throws Exception {
Assertions.assertThrows(Exception.class, () -> firstService.hz());
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
verify(secondService).handleErrorMessage(argumentCaptor.capture());
String value = argumentCaptor.getValue();
assertEquals("asdf", value);
}