ฉันใช้ม็อกกิโตในการทดสอบจูนิท คุณจะสร้างข้อยกเว้นได้อย่างไรและยืนยันว่ามี (รหัสหลอกทั่วไป)
ฉันใช้ม็อกกิโตในการทดสอบจูนิท คุณจะสร้างข้อยกเว้นได้อย่างไรและยืนยันว่ามี (รหัสหลอกทั่วไป)
คำตอบ:
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()
มันมาจากไหน?
คำตอบที่อัปเดตสำหรับ 06/19/2015 (หากคุณใช้ java 8)
เพียงใช้ assertj
ใช้ assertj-core-3.0.0 + Java 8 Lambdas
@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
ประโยคถูกต้องก็ต้องมีข้อยกเว้น
ใช้doThrow ของ Mockitoแล้วจับข้อยกเว้นที่ต้องการเพื่อยืนยันว่าถูกโยนทิ้งในภายหลัง
@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);
}
การใช้ม็อกกิโตคุณสามารถทำให้ข้อยกเว้นเกิดขึ้นได้
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());
}
ค้นหาตัวอย่างได้ที่นี่: ยืนยันข้อยกเว้น junit
หรือถ้าข้อยกเว้นของคุณถูกโยนออกจากตัวสร้างของคลาส:
@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);
}
ไม่เกี่ยวข้องกับ mockito เราสามารถจับข้อยกเว้นและยืนยันคุณสมบัติของมันได้ หากต้องการตรวจสอบว่ามีข้อยกเว้นเกิดขึ้นให้ยืนยันเงื่อนไขเท็จภายในบล็อกการลองหลังจากคำสั่งที่แสดงข้อยกเว้น
ยืนยันด้วยข้อความยกเว้น:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.getMessage());
}