Kev*_*dra 17 java junit mocking mockito
以下方法的等效方法是什么:
@Mock
MyType1 myType1;
@Autowired
@InjectMocks
MyType2 myType2;
Run Code Online (Sandbox Code Playgroud)
我可以代替@Mock使用mock(MyType1.class).
但是如何@InjectMocks用方法调用替换?像这样的东西:
injectMocks(MyType2.class)
Run Code Online (Sandbox Code Playgroud)
Bri*_*ice 13
Mockito中没有用于模拟注入的公共API.此外,由于此注释主要是在测试中布置事物的方式上进行的,因此它与测试的初始化阶段相关.
虽然它可能会在未来某个时候发生变化.
但是,Mockito注释字段可以通过MockitoJUnitRunner或通过以下方式初始化MockitoAnnotations.initMocks().它们都创建模拟实例并执行注入.
我也在你的代码中看到你正在使用的@Autowired- 因此可能是通过XML配置的spring东西.@InjectMocks并没有真正开发出与其他依赖注入框架一起工作,因为开发是由单元测试用例驱动的,而不是集成测试.
你可能想看看springockito,这是另一个试图在Spring中缓解Mockito模拟创建的项目.
希望有所帮助
为什么Autowired在您的 junit 测试中使用?由于您正在模拟依赖项,因此MyType2您在编写测试时必须知道它的 concreate 实现。
那么你不需要也不应该使用 Spring 或任何注入框架来创建MyType2你想要测试的实例。直接在您的测试初始化中创建它!我知道使用 IoC 框架多年后,编写myType2 = new MyType2Impl(mock(myType1.class))起来很困难,但它确实会让您的测试更简单、更快(因为没有要构建的应用程序上下文)。例如:
@Before
public void setup() {
myType1 = mock(MyType1.class);
myType2 = new MyType2Impl(myType1);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您真的想在 junit 测试中使用 IoC,请使用Brice 建议的springockito,并MyType1在您的应用程序上下文中构建您的模拟。