【问题标题】:EasyMock @Mock is not working same as createMock for abstract classesEasyMock @Mock 与抽象类的 createMock 不一样
【发布时间】:2017-05-05 14:58:20
【问题描述】:

根据答案here,@Mock 注释和 createMock 从功能视图来看是相同的。但是,我在使用这些时遇到了一个奇怪的问题。这里有一点背景。

我必须测试从 Abstractclass 调用方法的 ClassUnderTest。当我应该从单元测试调用 ClassUnderTest 时,我希望调用 Abstractclass 方法。

`

    public abstract AbstractClass {

        public void addValue(int a, int b) {
        // Invoking another method which is abstract.
        };
    }


    public class ClassUnderTest {

        public Abstractclass obj;
        public ClassUnderTest(Abstractclass obj) {
        // Parameterized constructor.
        }
        public MethodToTest(){ 
             object.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.expectLastCall().once();
    EasyMock.replay();
    new ClassUnderTest().methodToTest();
    EasyMock.verify() // The code under scan.
    }  
}

` 我面临这些问题:

  1. 当我使用@Mock 注解时,EasyMock verify 会抛出一个错误,提示 Abstractclass.addValue() 期望未满足。

  2. 但是,当我删除 @Mock 注释时,它可以正常工作并且没有错误。

  3. 对于非抽象类,@Mock 对我来说效果很好。

谁能解释一下这种行为?

【问题讨论】:

    标签: java unit-testing annotations mocking easymock


    【解决方案1】:

    您的真实代码必须与此不同。两者的行为应该完全相同。否则它是一个错误。我尝试了您的代码(应用了很多修复。下次您应该发布正确运行的示例)。它完美地工作。在这里

    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。
    • 只调用一次void方法录制是同义词。我已经更新了我的答案,让它变得超级清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多