我们正在为一个使用 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/