Tôi đang sử dụng mockito trong một bài kiểm tra Junit. Làm thế nào để bạn thực hiện một ngoại lệ xảy ra và sau đó khẳng định rằng nó có (mã giả chung)
Tôi đang sử dụng mockito trong một bài kiểm tra Junit. Làm thế nào để bạn thực hiện một ngoại lệ xảy ra và sau đó khẳng định rằng nó có (mã giả chung)
Câu trả lời:
Một mình Mockito không phải là giải pháp tốt nhất để xử lý các trường hợp ngoại lệ, hãy sử dụng Mockito với Catch-Exception
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
caughtException
?
com.googlecode.catchexception.CatchException.caughtException;
Để trả lời câu hỏi thứ hai của bạn đầu tiên. Nếu bạn đang sử dụng JUnit 4, bạn có thể chú thích bài kiểm tra của mình với
@Test(expected=MyException.class)
để khẳng định rằng một ngoại lệ đã xảy ra. Và để "chế nhạo" một ngoại lệ với mockito, hãy sử dụng
when(myMock.doSomething()).thenThrow(new MyException());
Nếu bạn cũng muốn kiểm tra thông báo ngoại lệ, bạn có thể sử dụng ExpectedException của JUnit với 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()
Trường hợp nào này đến từ đâu?
Câu trả lời được cập nhật cho ngày 19 tháng 6 năm 2015 (nếu bạn đang sử dụng java 8)
Chỉ cần sử dụng assertj
Sử dụng assertj-core-3.0.0 + Java 8 Lambdas
@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
.isInstanceOf(IllegalArgumentException.class);
}
Tham khảo: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html
Nếu bạn đang sử dụng JUnit 4 và Mockito 1.10.x Chú thích phương pháp kiểm tra của bạn với:
@Test(expected = AnyException.class)
và để sử dụng ngoại lệ mong muốn của bạn:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
Làm cho ngoại lệ xảy ra như thế này:
when(obj.someMethod()).thenThrow(new AnException());
Xác minh nó đã xảy ra hoặc bằng cách khẳng định rằng bài kiểm tra của bạn sẽ đưa ra một ngoại lệ như vậy:
@Test(expected = AnException.class)
Hoặc bằng cách xác minh giả thông thường:
verify(obj).someMethod();
Tùy chọn thứ hai là bắt buộc nếu thử nghiệm của bạn được thiết kế để chứng minh mã trung gian xử lý ngoại lệ (nghĩa là ngoại lệ sẽ không bị ném khỏi phương thức thử nghiệm của bạn).
verify
cuộc gọi có khẳng định ngoại lệ?
when
điều kiện là đúng, nó phải có một ngoại lệ.
Sử dụng doThrow của Mockito và sau đó bắt ngoại lệ mong muốn để khẳng định nó được ném sau đó.
@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);
}
Sử dụng mockito, bạn có thể làm cho ngoại lệ xảy ra.
when(testingClassObj.testSomeMethod).thenThrow(new CustomException());
Sử dụng Junit5, bạn có thể xác nhận ngoại lệ, xác nhận xem ngoại lệ đó có bị ném khi phương thức kiểm tra được gọi hay không.
@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());
}
Tìm một mẫu ở đây: khẳng định ngoại lệ
Không liên quan đến mockito, người ta có thể bắt ngoại lệ và khẳng định tính chất của nó. Để xác minh rằng ngoại lệ đã xảy ra, hãy xác nhận một điều kiện sai trong khối thử sau khi tuyên bố ném ngoại lệ.
Hoặc nếu ngoại lệ của bạn được ném từ hàm tạo của một lớp:
@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);
}
Khẳng định bằng tin nhắn ngoại lệ:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.getMessage());
}