如何注入EasyMock的模拟测试将级私人领域(How to inject EasyMock moc

2019-09-16 08:02发布

我使用了EasyMock创建模拟是在测试类中的私有参数(不二传手)之一。 我尝试使用反射 - 但它不能正常工作。

public class TestedClassTest{
    @Test
    public void test(){
      TestedClass instance = new TestedClass();
      MockedClass mocked = EasyMock.createMock(MockedClass.class);
      Data data = new Data();

      //Void setter
      DataType dataType = (myDataType.DataType) EasyMock.anyObject();
      mocked.setDataType(dataType);
      EasyMock.expectLastCall();

      //expect
      EasyMock.expect(mocked.getData()).andReturn(data);
      EasyMock.replay(mocked);

      Field field = instance.getClass().getDeclaredField("mockedClass")
      field.setAccessible(true);
      field.set(instance, mocked);

      //run tested method
      instance.someAction();

      EasyMock.verify(mocked);
   }
}

即时得到失败信息:

Unexpected method call MockedClass.setDataType(myData.MyData@104306d75):
MockedClass.getData(): expected: 1, actual: 0
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType(myData.MyData@132006d75):
MockedClass.getData(): expected: 1, actual: 0

Im肯定此方法中的测试“instance.someAction()”上的“MockedClass”对象烧制

如何解决这个问题呢?

编辑-答:纠正经过一番replay.mocked()我发现(!这么简单)多了一个无效的方法应该使用声明EasyMock.expectLastCall()

Answer 1:

你的反射代码看起来不错。

它是因为我已经使用了EasyMock很长一段时间,但不replay只应该在测试中每一次模拟叫? 您两次调用它。 尝试摆脱第一的replay调用。

在这种情况下,它是有意义的有一个包含模拟是公共领域? 在一般情况下,合作者应通过两种构造函数或setter设置,消除了反射有必要在所有。

编辑-根据您的更新-错误指示setDataType拜访了模拟,但模拟没想到它被调用。 也许你的类调用它两次,也许它被称为失灵,或你没有想到的参数调用它(虽然我期望的错误是在这种情况下,不同的)。



文章来源: How to inject EasyMock mock into tested class private field