问题
我正在使用Mockito的@Mock
和@InjectMocks
注释将依赖项注入私有字段,这些字段使用Spring的@Autowired
进行注释:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Mock
private SomeService service;
@InjectMocks
private Demo demo;
/* ... */
}
和
public class Demo {
@Autowired
private SomeService service;
/* ... */
}
现在我想将真正的对象注入private@Autowired
fields(没有setter)。这是可能的还是机制仅限于注射Mocks?
#1 热门回答(203 赞)
Use@Spy
annotation
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Spy
private SomeService service = new RealServiceImpl();
@InjectMocks
private Demo demo;
/* ... */
}
Mockito将考虑所有具有@Mock
或@Spy
注释的字段作为注入带有@InjectMocks
注释的实例的潜在候选者。在上面的案例中,'RealServiceImpl'
实例将被注入'demo'
有关详细信息,请参阅
Mockito-home@Spy@Mock
#2 热门回答(17 赞)
除了@Dev Blanked的答案,如果你想使用Spring创建的现有bean,代码可以修改为:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Inject
private ApplicationContext ctx;
@Spy
private SomeService service;
@InjectMocks
private Demo demo;
@Before
public void setUp(){
service = ctx.getBean(SomeService.class);
}
/* ... */
}
这样你就不需要更改代码(添加另一个构造函数)来使测试工作。