如果使用JMock使用mocking编写Java单元测试,我们应该使用
Mockery context = new Mockery()
或
Mockery context = new JUnit4Mockery()
两者之间有什么区别,我们应该何时使用哪一个?
答案 0 :(得分:9)
@Rhys JUnit4Mockery
取代了调用assertIsSatisfied
,JMock.class
(与@RunWith
相结合)的需要,而不是assertIsSatisfied
。创建常规Mockery
时,您无需致电JUnit4Mockery
。
ExpectationError
会转换错误。
默认情况下,期望例外在Junit中报告为Mockery context = new Mockery();
,例如,使用
unexpected invocation: bar.bar()
no expectations specified: did you...
- forget to start an expectation with a cardinality clause?
- call a mocked method to specify the parameter of an expectation?
你会得到
Mockery context = new JUnit4Mockery();
并使用,
java.lang.AssertionError: unexpected invocation: bar.bar()
no expectations specified: did you...
- forget to start an expectation with a cardinality clause?
- call a mocked method to specify the parameter of an expectation?
what happened before this: nothing!
你会得到
{{1}}
JUnit4Mockery将ExpectationError转换为JUnit处理的java.lang.AssertionError。最终结果是它会在您的 JUnit报告中显示为失败(使用JUnit4Mockery)而不是错误。
答案 1 :(得分:1)
将JMock与JUnit 4一起使用时,可以通过利用JMock测试运行器来避免一些样板代码。执行此操作时,必须使用JUnit4Mockery而不是常规Mockery。
以下是构建JUnit 4测试的方法:
@RunWith(JMock.class)
public void SomeTest() {
Mockery context = new JUnit4Mockery();
}
主要优点是无需在每次测试中调用assertIsSatisfied
,每次测试后都会自动调用它。
答案 2 :(得分:0)
更好的是,每http://incubator.apache.org/isis/core/testsupport/apidocs/org/jmock/integration/junit4/JUnitRuleMockery.html使用@Rule并避免使用其他系统可能需要的@RunWith:
public class ATestWithSatisfiedExpectations {
@Rule
public final JUnitRuleMockery context = new JUnitRuleMockery();
private final Runnable runnable = context.mock(Runnable.class);
@Test
public void doesSatisfyExpectations() {
context.checking(new Expectations() {
{
oneOf(runnable).run();
}
});
runnable.run();
}
}