2013-03-06 169 views
2

我正在为特定方法编写junit测试。该方法包含调用DAO类中的其他方法,我正在使用EasyMock进行模拟。正确使用expectLastCall()。一次()在EasyMock

我想断言这些DAO类方法之一被调用一次,这是我所期望的LastCall()。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一个电话,它只会发生一次。我并不真正关心某些方法,但是当然EasyMock会抱怨说,如果没有告诉我们期望它。

谢谢!

回答

1

这对我来说看起来是正确的。您可以轻松地通过移除对void方法的调用并验证测试失败,或者通过向void方法添加第二个调用并查看测试也失败来轻松进行检查。

+0

是的,它失败在这两个场景中,谢谢。 – user1088166 2013-03-06 14:22:32

1

如果你不关心一些方法,你应该创建一个很好的模拟。那么,的确没有必要调用expectLastCall。这是隐含的,但可以是一个很好的做法,让你明显地嘲笑一种方法。一次()也不需要,因为它是默认值。

因此,如果改换,用一个漂亮的米克,消除隐含调用,将静态导入,并且不添加多余的“本”,你应该得到:

@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 
}