没有结果的 Expectations 块是否与 Verifications 块相同?
Is an Expectations block without a result the same thing as a Verifications block?
我知道一般来说,Expectations
用于模拟具有不同 return 值的值。例如:
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
块是一回事吗?可以根据个人喜好使用吗?还是我遗漏了两者之间的细微差别?
你说得对,它们的工作原理相似。如果您在 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 断言。
我知道一般来说,Expectations
用于模拟具有不同 return 值的值。例如:
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
块是一回事吗?可以根据个人喜好使用吗?还是我遗漏了两者之间的细微差别?
你说得对,它们的工作原理相似。如果您在 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 断言。