java - 使用 JMockit 模拟 Autowiring 的接口(interface)实现

标签 java spring junit mocking jmockit

我们正在为一个使用 Spring Autowiring 注入(inject)依赖项的类编写 JUnit 测试,该依赖项是接口(interface)的某个实例。由于被测类从未显式实例化依赖项或将其传递给构造函数,因此 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();
   }

}

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

最佳答案

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

您必须手动注入(inject)模拟实例。例如:

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
   }
}

mockit.Deencapsulation 是一个基于反射的实用程序类,可让您调用私有(private)方法、获取/设置字段等。

关于java - 使用 JMockit 模拟 Autowiring 的接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1980596/

相关文章:

java - 使用高级正则表达式分割字符串

java - 在 Active Directory 中查找具有网络 ID 的用户需要搜索过滤器

java - 避免在 Spring 中为 TImeline 功能创建重复项

java - 配置spring缓存咖啡因

java - 从 junit 中拦截 http 调用的最简单方法是什么?

java - 如何在 JUnit 中使用 assertEquals 和 Epsilon 断言两个 double ?

java - 如何使用java程序中的参数运行bat文件? (尝试使用命令行工具实现自动化)

java - 无法在 Java 控制台中打印 MySql 表的最小值、平均值、最大值

java - 如何在 Java 中创建处理泛型和数组的抓取方法

java - 这是测试构造函数的有效方法吗