Junit testinde mockito kullanıyorum. Bir istisnayı nasıl gerçekleştirirsiniz ve sonra sahip olduğunu iddia edersiniz (genel sözde kod)
Junit testinde mockito kullanıyorum. Bir istisnayı nasıl gerçekleştirirsiniz ve sonra sahip olduğunu iddia edersiniz (genel sözde kod)
Yanıtlar:
Tek başına Mockito istisnaları ele almak için en iyi çözüm değildir, Catch-Exception ile Mockito kullanın
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
caughtException
?
com.googlecode.catchexception.CatchException.caughtException;
Önce ikinci sorunuzu cevaplamak için. JUnit 4 kullanıyorsanız, testinize ek açıklama ekleyebilirsiniz.
@Test(expected=MyException.class)
bir istisnanın meydana geldiğini iddia etmek için. Mockito ile bir istisna "taklit etmek" için şunu kullanın:
when(myMock.doSomething()).thenThrow(new MyException());
İstisna mesajını da test etmek istiyorsanız, JUnit's ExpectedException'ı Mockito ile kullanabilirsiniz:
@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()
bu nereden geliyor?
06/19/2015 için güncellenmiş yanıt (java 8 kullanıyorsanız)
Sadece assertj kullanın
Assertj-core-3.0.0 + Java 8 Lambdas'ı kullanma
@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
.isInstanceOf(IllegalArgumentException.class);
}
Referans: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html
JUnit 4 ve Mockito 1.10.x kullanıyorsanız, test yönteminize aşağıdakilerle açıklama ekleyin:
@Test(expected = AnyException.class)
ve istediğiniz istisna kullanımı atmak için:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
İstisnayı şu şekilde yapın:
when(obj.someMethod()).thenThrow(new AnException());
Ya testinizin böyle bir istisna atacağını iddia ederek bunun gerçekleştiğini doğrulayın:
@Test(expected = AnException.class)
Veya normal sahte doğrulama ile:
verify(obj).someMethod();
İkinci seçenek, testiniz ara kodun istisnayı işlediğini kanıtlamak için tasarlandıysa gereklidir (yani istisna test yönteminizden atılmaz).
verify
istisna assert çağrıyı?
when
cümle doğruysa, bir istisna atmış olmalı.
Mockito'nun doThrow'unu kullanın ve daha sonra atıldığını iddia etmek için istenen istisnayı yakalayın.
@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 kullanarak istisnayı gerçekleştirebilirsiniz.
when(testingClassObj.testSomeMethod).thenThrow(new CustomException());
Junit5'i kullanarak, bir istisna belirleyebilir, test yöntemi çağrıldığında bu istisnanın atılıp atılmadığını ileri sürebilirsiniz .
@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());
}
Burada bir örnek bulun: istisna ileri sürün
Mockito ile ilgisi olmayan kişi istisnayı yakalayabilir ve özelliklerini öne sürebilir. İstisnanın gerçekleştiğini doğrulamak için, istisnayı atan ifadeden sonra try bloğu içinde yanlış bir koşul ileri sürün.
Veya istisnanız bir sınıfın yapıcısından atılırsa:
@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);
}
İstisna mesajıyla onaylayın:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.getMessage());
}