Java Mockito如何模拟和断言抛出的异常?
我在junit测试中使用mockito。如何使异常发生,然后断言它具有(通用伪代码)以首先回答第二个问题。如果您使用的是JUnit4,那么可以使用Java Mockito如何模拟和断言抛出的异常?,java,exception-handling,junit,mockito,Java,Exception Handling,Junit,Mockito,我在junit测试中使用mockito。如何使异常发生,然后断言它具有(通用伪代码)以首先回答第二个问题。如果您使用的是JUnit4,那么可以使用 @Test(expected=MyException.class) 断言发生了异常。要使用mockito“模拟”异常,请使用 when(myMock.doSomething()).thenThrow(new MyException()); 使异常像这样发生: when(obj.someMethod()).thenThrow(new AnExcep
@Test(expected=MyException.class)
断言发生了异常。要使用mockito“模拟”异常,请使用
when(myMock.doSomething()).thenThrow(new MyException());
使异常像这样发生:
when(obj.someMethod()).thenThrow(new AnException());
通过断言您的测试将引发这样一个异常来验证它是否发生:
@Test(expected = AnException.class)
或通过正常模拟验证:
verify(obj).someMethod();
如果您的测试旨在证明中间代码处理异常(即,不会从您的测试方法中抛出异常),则需要后一个选项。风格的解决方案(更新为Java 8)
Mockito本身并不是处理异常的最佳解决方案,请将Mockito与Catch Exception一起使用
莫基托++
示例代码
@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
.isInstanceOf(IllegalArgumentException.class);
}
参考:如果您使用的是JUnit4和Mockito 1.10.x 用以下内容注释您的测试方法:
@Test(expected = AnyException.class)
要抛出所需的异常,请使用:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
如果还想测试异常消息,可以将JUnit的ExpectedException与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"));
}
使用mockito,可以使异常发生
when(testingClassObj.testSomeMethod).thenthow(newcustomexception())代码>
使用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());
}
在这里找到一个示例:与mockito无关,可以捕获异常并断言其属性。若要验证异常是否发生,请在引发异常的语句之后的try块中断言一个false条件。assert by exception message:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.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);
}
使用并捕获所需的异常,以断言它是在以后引发的
@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);
}
我想这应该对你有用
assertThrows(someException.class,
()->mockedServiceReference.someMethod(param1,parme2,…) verify
调用是否断言异常?@NilsH否。但是如果当
子句正确时,它一定抛出了异常。什么是“catch exception”?有链接吗?什么是caughtException
?有,它来自com.googlecode.catchexception.catchexception.caughtException当您测试具有某种状态的对象的方法时,这种方法是不可接受的。例如,有一个对象方法在您第二次调用它时抛出异常。您需要测试它是否在第二个方法调用期间抛出异常,而不是在第一个方法调用期间抛出异常。如果它在第一次方法调用期间(在准备阶段)抛出MyException,那么测试应该失败。但使用这种方法,我们无法检查在哪个方法调用期间引发异常。尽管在这种情况下,我们可以从第一个方法调用捕获异常并将其包装到RuntimeException中。谢谢!为…工作me@MariuszS回答正确地回答了您所说的与之无关的内容Mockito@pringi谢谢,我看到这个问题既涉及到模仿异常,也涉及到捕获异常。我想知道这是否取决于被测代码的任何行为。given()
这是从哪里来的?来自mockito core:我也更喜欢使用@Rule,因为这样我可以测试预期的消息、原因或与异常相关的其他内容。为了检查异常的原因,我使用了:expectedException.expectCause(Mockito.sameInstance(expectedException))或expectedException.expectCause(Mockito.instanceOf(MyException.class))和一些其他方便的方法。对我有用…我们还可以检查异常消息。AssertThrownby(()->myService.SummingWong(“badArg”)).hasMessage(“test”).isInstanceOf(IllegalArgumentException.class);如果这样写,当没有抛出异常时,测试仍然会通过。这是我们首先要避免的
@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);
}