当前位置: 首页 > 知识库问答 >
问题:

在测试异常时,如何验证调用了方法[重复]

林弘文
2023-03-14

考虑以下代码:

@Rule ExpectedException expected = ExpectedException.none();
@Mock private MyObject mockMyObject;
private Converter converter; // Object under test

@Before public void before() {
    MockitoAnnotations.initMocks(this);
    when(mockMyObject.doSomething1()).thenReturn(1);
    when(mockMyObject.doSomething2()).thenReturn("2");
}

@After public void after() {
    verifyNoMoreInteractions(mockMyObject); // Exception test fails here
}

@Test public void testConverter() {
    assertThat(converter.convert(mockMyObject), notNullValue());
    verify(mockMyObject).doSomething1();
    verify(mockMyObject).doSomething2();
}

@Test public void testConverterException() {
    when(mockMyObject.doSomething1()).thenThrow(MyException.class);
    expected.expect(MyException.class);
    converter.convert(mockMyObject);
    verify(mockMyObject).doSomething1(); // Never gets called
}

我想做的是,在异常测试中,标记我希望调用doSomething1()。然而,在转换器上抛出异常。convert(),这意味着永远不会调用verify()调用。因此,verifyNoMoreInteractions()在after()中失败。

注意:这是一个非常通用的示例,用于隐藏我们的任何内部代码。

共有1个答案

侯善
2023-03-14

好的,德普。我发现类似的问题已经存在,简单的答案是:

@Test public void testConverterException() {
    when(mockMyObject.doSomething1()).thenThrow(MyException.class);
    expected.expect(MyException.class);
    try {
        converter.convert(mockMyObject);
    } finally {
        verify(mockMyObject).doSomething1(); // Now it gets called
    }
}
 类似资料:
  • 最近,在一次代码审查中,一位同事说“测试不应该有try-catch块”。他还向我指出了关于的信息,我可以使用它重写对异常数据执行检查的一些测试。 然而,我遇到了一种情况,我不确定我是否能消除试捕。我正在为一个方法编写单元测试,该方法将抛出一个异常,并执行一些我需要使用JMockit验证的行为。假设测试中的代码包含如下内容 JUnit测试当前看起来像 我找不到摆脱试捕的好方法。就我个人而言,我不认为

  • 我对b()有一套完整的测试,它完成了繁重的任务。不幸的是,我不得不做一个丑陋的想法,比如()(遗留代码),我不想复制所有的测试。方法b()的。此外,这两个都需要公开。 我想验证在某些情况下a()调用b(),但我不能这样做,beacause测试类不是mock。我需要一种方法来验证该方法是在真实对象上调用的,而不仅仅是在模拟对象上调用的。

  • 我试图测试一个if条件,使用时(),然后返回(),但是当我运行我的测试用例时,它会给我丢失的方法调用,即使我已经嘲笑了实现该方法的类。 这就是我想嘲笑的如果条件 这就是我检查if条件的方式 我已经用@Mock annotation模拟了“request”,但仍然得到下面的异常。 我不确定我做错了什么。有人能帮忙吗?

  • 我正在面对 我已经检查了所有参数和要传递以验证的对象,但无法找出导致上述异常的原因 我要测试的条件, 测试用例 堆栈跟踪 我用同样的方法做了其他测试用例,它已经工作了,但是我不知道为什么它在这里不起作用,而且所有的方法都是公开的。请帮我弄清楚,谢谢

  • 我想在调用doSomething()时验证是否调用过一次someMethod。在doSomething()中,正在调用currentTimeMillis(),该值将不完全相同。我如何测试这个? 当前我收到以下错误消息: *org.mockito.exceptions.misusing.未完成验证例外: 此处缺少验证(模拟)的方法调用:- 正确验证示例:验证(模拟)。doSomething()* B