我正在为特定方法编写junit测试。该方法包含对DAO类中其他方法的调用,我正在使用EasyMock进行模拟。
我想声明其中一个DAO类方法被调用一次,这就是我假设expectLastCall()。once()的用法。有问题的方法返回void。
我目前通过的测试,我只是想确保我的逻辑是正确的,因为我之前没有使用过EasyMock。我使用这个问题作为参考:EasyMock expectations with void methods
所以,这是代码:
@Before
public void setUp() throws Exception{
this.fooService = new FooService();
this.fooMock = createStrictMock(FooDAO.class);
}
@Test
public void test_fooTest(){
String arg1 = "arg1";
String arg2 = "arg2";
this.fooService.setFooDAO(fooMock);
expect(this.fooMock.someMethod(arg1, arg2)).andReturn(something);
fooMock.methodThatShouldBeCalledOnce(EasyMock.<Object>anyObject());
EasyMock.expectLastCall().once();
replay(this.fooMock);
this.fooService.methodUnderTest(someArg, someArg2);
verify(this.fooMock);
}
我认为这样做是断言有一个对methodThatShouldBeCalledOnce的调用,并且它只发生一次。我并不关心someMethod,但当然EasyMock会抱怨它是否没有被告知期待它。
谢谢!
答案 0 :(得分:1)
这对我来说是正确的。您可以通过删除对void方法的调用并验证测试失败,或者通过向void方法添加第二次调用并查看测试也失败来自行检查。
答案 1 :(得分:1)
如果你不关心某些方法,你应该创建一个漂亮的模拟。然后,实际上,没有必要调用expectLastCall。它是隐含的,但是很明显你是在嘲笑一个方法。也不需要once(),因为它是默认值。
所以,如果改写它,使用一个好的mick,删除隐式调用,添加静态导入而不添加多余的“this”,你应该得到:
@Before
public void setUp() throws Exception{
fooService = new FooService();
fooMock = createNiceMock(FooDAO.class);
fooService.setFooDAO(fooMock);
}
@Test
public void test_fooTest(){
fooMock.methodThatShouldBeCalledOnce(anyObject());
replay(fooMock); // or replayAll() if you extend EasyMockSupport
fooService.methodUnderTest(someArg, someArg2);
verify(fooMock); // or verifyAll() if you extend EasyMockSupport
}