Unit testing 在EasyMock中正确使用expectLastCall().once()

Unit testing 在EasyMock中正确使用expectLastCall().once(),unit-testing,junit,easymock,Unit Testing,Junit,Easymock,我正在为一个特定的方法编写junit测试。该方法包含对DAO类中其他方法的调用,我正在用EasyMock模拟该类 我想声明这些DAO类方法中的一个被调用一次,这就是我假设expectLastCall().once()的作用。该方法返回void 我目前通过的测试,我只是想确保我的逻辑是正确的,因为我以前没有使用EasyMock。我用这个问题作为参考: 下面是代码: @Before public void setUp() throws Exception{ this.fooS

我正在为一个特定的方法编写junit测试。该方法包含对DAO类中其他方法的调用,我正在用EasyMock模拟该类

我想声明这些DAO类方法中的一个被调用一次,这就是我假设expectLastCall().once()的作用。该方法返回void

我目前通过的测试,我只是想确保我的逻辑是正确的,因为我以前没有使用EasyMock。我用这个问题作为参考:

下面是代码:

    @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);

    }
@之前
public void setUp()引发异常{
this.fooService=新的fooService();
this.fooMock=createStrictMock(FooDAO.class);
}
@试验
公共空隙试验{
字符串arg1=“arg1”;
字符串arg2=“arg2”;
this.fooService.setFooDAO(fooMock);
expect(this.fooMock.someMethod(arg1,arg2)).andReturn(something);
应该调用的fooMock.method(EasyMock.anyObject());
EasyMock.expectLastCall().once();
重播(this.fooMock);
this.fooService.methodUnderTest(someArg,someArg2);
验证(此.fooMock);
}
我认为它所做的是断言对方法的调用应该被调用,并且只发生一次。我真的不在乎什么方法,但如果没有人告诉EasyMock期待它,EasyMock当然会抱怨


谢谢大家!

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

如果您不关心某些方法,您应该创建一个好的模拟。那么,实际上,没有必要调用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
}