Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito如何模拟和断言抛出的异常?_Java_Exception Handling_Junit_Mockito - Fatal编程技术网

Java Mockito如何模拟和断言抛出的异常?

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

我在junit测试中使用mockito。如何使异常发生,然后断言它具有(通用伪代码)

以首先回答第二个问题。如果您使用的是JUnit4,那么可以使用

@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一起使用

莫基托++ 示例代码
依赖关系

2015年6月19日的更新答案(如果您使用的是java 8)

只需使用assertj即可

使用assertj-core-3.0.0+Java 8 Lambdas

@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.caughtExceptiongiven()
这是从哪里来的?来自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);
}