【问题标题】:Test return statement in Mockito在 Mockito 中测试返回语句
【发布时间】:2023-03-25 21:20:01
【问题描述】:

我有一个代码,里面有一个条件,在某些条件下什么都不做,如下所示。我想测试那个特定的场景。

被测代码,返回语句:

public void someTask(){
    if(somecondition){
        return;
    }else if(){
    //more work to do
    }
}

到目前为止,我已经尝试过但失败了:

@Test
public void testSomeTask(){
    when(mock.somecondition()).thenReturn(true);

    mock.someTask();

    verifyNoMoreInteractions(mock);  //fails
    verifyZeroInteractions(mock);    //fails this calls the above method anyway
}

更新:条件和被测方法属于同一个类。我正在监视该课程而不是嘲笑,但结果是一样的。我得到的错误是 这里不需要交互,指向我的 verifyNoMoreInteractions 行。 但是在mock上发现了这个交互,指向了上面的调用。我将更改参数并强制它指向我的行并稍后提供更新。我想我知道我的测试出了什么问题。

解决方案: 验证方法调用和将作为被测方法参数的结果调用的所有其他调用,并验证条件本身。然后在最后验证NomoreINteractions。不幸的是,没有办法验证返回的结果是什么都没有被调用;此版本的 Mockito 的声明。拥有类似 verifyNothingIsDone 这样的工具会很方便,就像 doNothing().when(.....);

【问题讨论】:

    标签: android junit mockito powermockito


    【解决方案1】:

    您似乎正在尝试测试模拟实例的实现。

    相反,您应该使用 spy 并且只模拟 somecondition()

    然后你需要验证实际的交互。

    verify(spy).someTask();
    verify(spy).somecondition();
    verifyNoMoreInteractions(spy);
    

    verifyZeroInteractions 检查将始终失败,因为与模拟存在交互。

    【讨论】:

    • 感谢您的快速回复。但我正在监视班级,somecondition 也是其中的一员。我如何同时模拟和监视同一个班级。我应该在我最初的帖子中包含这个。但是我如何测试 return 语句,这意味着此时什么都不会发生?
    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2019-06-09
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多