Java EasyMock@Mock与createMock对抽象类的作用不同
根据答案,@Mock annotation和createMock在功能视图中是相同的。但是,在使用这些时,我面临一个奇怪的问题。这里没有什么背景 我必须测试ClassUnderTest,它从Abstractclass调用方法。当我应该从单元测试调用ClassUnderTest时,我希望调用Abstractclass方法 ` ` 我面临这些问题:Java EasyMock@Mock与createMock对抽象类的作用不同,java,unit-testing,annotations,mocking,easymock,Java,Unit Testing,Annotations,Mocking,Easymock,根据答案,@Mock annotation和createMock在功能视图中是相同的。但是,在使用这些时,我面临一个奇怪的问题。这里没有什么背景 我必须测试ClassUnderTest,它从Abstractclass调用方法。当我应该从单元测试调用ClassUnderTest时,我希望调用Abstractclass方法 ` ` 我面临这些问题: 当我使用@Mock注释时,EasyMock verify抛出一个错误,表示Abstractclass.addValue()期望值未满足 但是,当我删除@
有人能解释一下这种行为吗?您的真实代码必须与此不同。两者的行为应该完全相同。否则它就是一个bug。我尝试了你的代码(应用了很多修复程序。下次你应该发布正确运行的示例)。它工作得很好。给你
abstract class AbstractClass {
public abstract void foo();
public void addValue(int a, int b) {
foo();
}
}
class ClassUnderTest {
private AbstractClass obj;
public ClassUnderTest(AbstractClass obj) {
this.obj = obj;
}
public void methodToTest(){
obj.addValue(1, 2); // Calls the method.
}
}
@RunWith(EasyMockRunner.class)
public class TestFile {
@Mock
private AbstractClass concrete;
@Test
public void testMethod() {
// concrete = EasyMock.createMock(AbstractClass.class);
concrete.addValue(1,2);
EasyMock.replay();
new ClassUnderTest(concrete).methodToTest();
EasyMock.verify(); // The code under scan.
}
}
非常清楚。这4个词的意思完全相同:
// 1. Calling once the void method
concrete.addValue(1,2);
// 2. Calling once the void method and then using expectLastCall()
concrete.addValue(1,2);
expectLastCall();
// 3. Calling once the void method and then expect once
concrete.addValue(1,2);
expectLastCall().once();
// 4. Calling once the void method and then expect one time
concrete.addValue(1,2);
expectLastCall().time(1);
如果我必须检查concrete.addValue(1,2)只调用了一次,且调用次数不超过一次,该怎么办?由于这是一个void方法,我不能使用expect然后return,所以我使用了一次ExpectLastCall来实现这一点。我已经更新了我的答案,让它超级清晰。
// 1. Calling once the void method
concrete.addValue(1,2);
// 2. Calling once the void method and then using expectLastCall()
concrete.addValue(1,2);
expectLastCall();
// 3. Calling once the void method and then expect once
concrete.addValue(1,2);
expectLastCall().once();
// 4. Calling once the void method and then expect one time
concrete.addValue(1,2);
expectLastCall().time(1);