使用JMockit模拟自动连接的接口实现

Swi*_*ots 11 java junit spring jmockit mocking

我们正在为一个使用Spring自动装配注入依赖关系的类编写JUnit测试,该依赖关系是一个接口实例.由于被测试的类永远不会显式地实例化依赖项或者它在构造函数中传递,因此看起来JMockit也没有义务实例化它.

到目前为止,我们一直在使用SpringRunner为我们提供Spring加载模拟依赖项,这是有效的.我们不喜欢的两件事是:1)每次运行测试时都必须加载和初始化Spring框架,这不是非常快速的; 2)我们被迫显式创建所有模拟依赖项作为真正的类, JMockit有助于消除.

这是我们测试的简化示例:

public class UnitUnderTest {

   @Autowired
   ISomeInterface someInterface;

   public void callInterfaceMethod() {

      System.out.println( "UnitUnderTest.callInterfaceMethod calling someInterface.doSomething");
      someInterface.doSomething();
   }

}
Run Code Online (Sandbox Code Playgroud)

所以,问题是,有没有办法让JMockit创建一个模拟someInterface

Rog*_*rio 12

JMockit将始终实例化一个模拟接口(最终模拟字段除外),但这只发生在测试代码中.它不会自动将实例注入到测试代码中.

您必须手动注入模拟实例.例如:

public class SomeTest
{
   @Autowired UnitUnderTest unitUnderTest;
   @Mocked ISomeInterface theMock; // created and assigned automatically

   @Test
   public void testSomeMethod()
   {
      Deencapsulation.setField(unitUnderTest, theMock);
      //proceed with unit test here
   }
}
Run Code Online (Sandbox Code Playgroud)

mockit.Deencapsulation 是一个基于反射的实用程序类,允许您调用私有方法,获取/设置字段等.

  • 请注意:自从这个答案发布以来,JMockit已经添加了对模拟对象自动注入测试类的支持.在这个例子中,将`@Autowired`替换为`@Tested`,将`@Mocked`替换为`@Injectable`. (6认同)

Pau*_*zie 8

您可以使用在您的测试用例中org.springframework.test.util.ReflectionTestUtils明确注入您的模拟ISomeInterface.

文档