存根和验证中的Mockito重复

时间:2019-01-02 20:46:32

标签: java junit mockito

在某些情况下,EasyMock存根似乎可以代替验证。举一个简单的例子:

A级:

public class A {
    private B b;

    public A(B b) {
        this.b = b;
    }

    int main(int input) {
        return b.timesThree(input + 4);
    }
}

B级:

public class B {
    int timesThree(int input) {
        return input * 3;
    }
}

ATest类:

@ExtendWith(MockitoExtension.class)
public class ATest {
    @Mock
    B b;

    @InjectMocks
    A a;

    @Test
    void testMain() {
        doReturn(21).when(b).timesThree(7);

        int result = a.main(3);
        assertEquals(21, result);

        verify(b).timesThree(7);
    }

}

是否指向verify呼叫? when调用已经断言b.timesThree()的输入参数是7。

1 个答案:

答案 0 :(得分:1)

在这种情况下,没有。这取决于您在测试中真正要声明的内容。

在这里,您尝试测试以2值调用main方法时应该发生的事情

  1. timesThree应该以值+4调用

  2. timesThree返回的值应该由您的主函数返回

由于在测试中,以下三行足以断言上述两种情况,因此您无需在此处进行验证。

doReturn(21).when(b).timesThree(7);
int result = a.main(3);
assertEquals(21, result);

找出测试是否足够好的最简单方法是注释掉实现的一部分,并使测试失败(TDD)。只要您的考试不及格就可以了。

Ex:将4更改为5-测试失败,删除输入测试失败

假设您的timesThree方法未返回值,而是将其存储在某个地方

int main(int input) {
//Stores value somwhere
    b.timesThree(input + 4);
}

在这里,您必须确定断言timesThree的值是7。 在这种情况下,您需要进行验证,因为如果没有验证,您将永远无法通过失败的测试。

还附带一提,注释中有一个提到“如果将代码替换为return 21,则测试将通过;”

要对此进行证明,请考虑使用随机整数而不是硬编码值。这将确保您的实现中没有意外的硬编码。 随机整数的示例库 https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/math/RandomUtils.html#nextInt()