EasyMock @Mock与抽象类的createMock不同

时间:2017-05-05 14:58:21

标签: java unit-testing annotations mocking easymock

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

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

`

ActionText

` 我正面临着这些问题:

  1. 当我使用@Mock注释时,EasyMock验证会抛出一个错误,说明Abstractclass.addValue()期望未得到满足。

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

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

  4. 有人可以解释一下这种行为吗?

1 个答案:

答案 0 :(得分:0)

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

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