Mockito在异常Junit 4.10之后进行验证

我正在测试具有预期异常的方法。我还需要在引发异常后验证是否在某个模拟对象上调用了一些清除代码,但看起来该验证已被忽略。这是代码。我正在使用Junit

ExpectedExceptionRule验证预期的异常。

@Rule

public ExpectedException expectedEx = ExpectedException.none();

@Test

public void testExpectedException()

{

MockedObject mockObj = mock(MockedObj.class);

MySubject subject = new MySubject(mockedObj);

expectedEx.expect(MyException.class);

expectedEx.expectMessage("My exception message.");

subject.someMethodThrowingException();

verify(mockObj).

someCleanup(eq(...));

}

似乎verify完全被忽略了。无论我采用什么方法verify,我的测试都通过了,这不是我想要的。

知道为什么会这样吗?

回答:

ExpectedException通过将整个测试方法通过JUnit

@Rule 包装在try-

catch块中来工作。当您的代码引发异常时,它将堆栈上移至最接近的try

/ catch,恰好在ExpectedException实例中(该实例检查您所期望的异常)。

在Java中,如果方法中发生未捕获的异常,则控制将永远不会在该方法的后面返回到语句。同样的规则也适用于此:

从技术上讲,您可以将验证放在最后一块,但这往往是个坏习惯。

您的被测系统可能会引发意外的异常,或者根本没有异常,这将为您提供有用的故障消息和跟踪;但是,如果该失败导致您的验证或断言在该finally块中失败,那么Java将显示该消息,而不是有关意外异常或意外成功的消息。这可能会使调试变得困难,尤其是因为您的错误将来自跟随错误根源的代码行,错误地暗示其上的代码成功。

如果您确实需要在异常之后验证状态,则可以按照方法在每个方法的基础上随时返回:

@Test

public void testExpectedException()

{

MockedObject mockObj = mock(MockedObj.class);

MySubject subject = new MySubject(mockedObj);

try {

subject.someMethodThrowingException();

fail("Expected MyException.");

} catch (MyException expected) {

assertEquals("My exception message.", expected.getMessage());

}

verify(mockObj).someCleanup(eq(...));

}

更新: 使用Java

8的lambda表达式,您可以将功能接口调用足够简洁地包装在try块中,以变得有用。我想对这种语法的支持将在许多标准测试库中找到。

assertThrows(MyException.class,

() -> systemUnderTest.throwingMethod());

以上是 Mockito在异常Junit 4.10之后进行验证 的全部内容, 来源链接: utcz.com/qa/412991.html

回到顶部