Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EasyMock@Mock与createMock对抽象类的作用不同_Java_Unit Testing_Annotations_Mocking_Easymock - Fatal编程技术网

Java EasyMock@Mock与createMock对抽象类的作用不同

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()期望值未满足 但是,当我删除@

根据答案,@Mock annotation和createMock在功能视图中是相同的。但是,在使用这些时,我面临一个奇怪的问题。这里没有什么背景

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

`

` 我面临这些问题:

  • 当我使用@Mock注释时,EasyMock verify抛出一个错误,表示Abstractclass.addValue()期望值未满足

  • 但是,当我删除@Mock annotation时,它运行良好,没有错误

  • 对于非抽象类,@Mock对我来说很好


  • 有人能解释一下这种行为吗?

    您的真实代码必须与此不同。两者的行为应该完全相同。否则它就是一个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);