Я використовую mockito в тесті на Джуніт. Як зробити так, щоб виняток стався, а потім стверджував, що він має (загальний псевдо-код)
Я використовую mockito в тесті на Джуніт. Як зробити так, щоб виняток стався, а потім стверджував, що він має (загальний псевдо-код)
Відповіді:
Mockito поодинці - не найкраще рішення для обробки винятків, використовуйте Mockito з Catch-Exception
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
caughtException
?
com.googlecode.catchexception.CatchException.caughtException;
Щоб відповісти на ваше друге запитання першим. Якщо ви використовуєте JUnit 4, ви можете анотувати свій тест
@Test(expected=MyException.class)
стверджувати, що стався виняток. І щоб "знущатися над" винятком з макетом, використовуйте
when(myMock.doSomething()).thenThrow(new MyException());
Якщо ви хочете також перевірити повідомлення про виняток, ви можете скористатись очікуваним розширенням JUnit з Mockito:
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void testExceptionMessage() throws Exception {
expectedException.expect(AnyException.class);
expectedException.expectMessage("The expected message");
given(foo.bar()).willThrow(new AnyException("The expected message"));
}
given()
звідки це походить?
Оновлена відповідь за 19.06.2015 (якщо ви використовуєте java 8)
Просто використовуйте assrtj
Використання assertj-core-3.0.0 + Java 8 лямбда
@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
.isInstanceOf(IllegalArgumentException.class);
}
Довідка: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html
Якщо ви використовуєте JUnit 4 та Mockito 1.10.x Анотувати свій метод тестування за допомогою:
@Test(expected = AnyException.class)
і кинути бажаний виняток:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
Зробіть виняток таким чином:
when(obj.someMethod()).thenThrow(new AnException());
Переконайтеся, що це сталося або запевнивши, що ваш тест викине такий виняток:
@Test(expected = AnException.class)
Або за допомогою звичайної макетної перевірки:
verify(obj).someMethod();
Остання опція необхідна, якщо ваш тест призначений для доказу проміжного коду, який обробляє виняток (тобто виняток не буде викинуто з вашого методу тестування).
verify
виклик виняток?
when
застереження правильне, воно повинно викинути виняток.
Використовуйте MoTito's doThrow, а потім виберіть потрібний виняток, щоб стверджувати, що він був кинутий пізніше.
@Test
public void fooShouldThrowMyException() {
// given
val myClass = new MyClass();
val arg = mock(MyArgument.class);
doThrow(MyException.class).when(arg).argMethod(any());
Exception exception = null;
// when
try {
myClass.foo(arg);
} catch (MyException t) {
exception = t;
}
// then
assertNotNull(exception);
}
Використовуючи mockito, ви можете зробити виняток.
when(testingClassObj.testSomeMethod).thenThrow(new CustomException());
Використовуючи Junit5, ви можете стверджувати виняток, і стверджує, що це виключення кидається, коли викликається метод тестування .
@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
final ExpectCustomException expectEx = new ExpectCustomException();
InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
expectEx.constructErrorMessage("sample ","error");
});
assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}
Знайдіть зразок тут: стверджуйте виняток виключення
Не пов’язаний з макетом, можна зловити виняток і стверджувати його властивості. Щоб переконатися, що виняток стався, встановіть помилкову умову в блоці спробу після заяви, яка видаляє виняток.
Або якщо ваш виняток викинуто з конструктора класу:
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void myTest() {
exception.expect(MyException.class);
CustomClass myClass= mock(CustomClass.class);
doThrow(new MyException("constructor failed")).when(myClass);
}
Повідомлення за винятком повідомлення:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.getMessage());
}