Expectations阻止没有与Verifications块相同的结果吗?

时间:2016-06-16 22:31:42

标签: java jmockit

我理解,通常,Expectations用于模拟具有不同返回值的值。例如:

new Expectations() {{
    bar.getGreeting();
    result = "Hello, world!";
    times = 2;
}};

我注意到result是可选的。此时,此块仅确认该方法被调用两次,如果不是,则抛出MissingInvocation错误。例如:

@Test
public void testRunFoo(@Mocked final Bar bar) {
    Foo foo = new Foo(bar);
    new Expectations() {{
        bar.runBar();
        times = 2;
    }};

    foo.runFooWithBarTwice(); //Successful
    //foo.runFooWithoutBar(); //Will throw a MissingInvocationException
}

我注意到此代码与使用Verifications代码相同:

@Test
public void testRunFoo(@Mocked final Bar bar) {
    Foo foo = new Foo(bar);

    foo.runFooWithBarTwice(); //Successful
    //foo.runFooWithoutBar(); //Will throw a MissingInvocationException

    new Verifications() {{
        bar.runBar();
        times = 2;
    }};
}

Expectations块没有与Verifications块相同的结果吗?您可以根据个人喜好使用吗?或者我错过的两者之间是否存在一些微妙的差异?

1 个答案:

答案 0 :(得分:3)

你是对的,他们都会以同样的方式工作。如果您模拟Expectations块中的互动,则会对它们进行类似验证,以便将它们放在Verifications块中。

如果您在http://jmockit.org/gettingStarted.html的介绍页面中查看JMockit的设计理念,它建议使用以下模式编写测试

@Test
public void aTestMethod(<any number of mock parameters>)
{
   // Record phase: expectations on mocks are recorded; empty if nothing to record.

   // Replay phase: invocations on mocks are "replayed"; code under test is exercised.

   // Verify phase: expectations on mocks are verified; empty if nothing to verify.
}

Record阶段的目的不是验证您的测试代码,而是确保您测试的代码具有运行测试所需的依赖关系和交互。因此,Expectations块的目的是记录模拟对象需要执行的任何交互,以便在Replay阶段与您正在测试的代码进行交互。这通常意味着返回特定值或确保将正确的模拟对象用于交互。

我有时会将上面JMockit文档中的三条注释放在单元测试中,以帮助记录测试。

最后,Verifications块是您通常要对模拟对象交互进行验证的地方。请注意,您还可以在Verifications块之前,之后或之内使用标准Junit断言。