我在测试中有@Autowired
依赖项,其中包含另一个@Authowired
依赖项。我正在使用
@RunWith(SpringJUnit4ClassRunner.class)
和
@Rule
public PowerMockRule rule = new PowerMockRule();
为了在我的考试中获得春天语境。
我需要模仿@Autowired
成员的内部依赖关系。我可以通过编写以下代码来完成此任务:
@Autowired
private CartService cartService;
private MyValidator validator;
@Test
public void addItemToCartTest() {
validator = PowerMock.createMock(MyValidator.class);
expect(validator.validate(item)).andReturn(true);
cartService.setValidator(validator);
PowerMock.replayAll();
cartService.addItem(item);
//some code
verifyAll();
}
一切都是这样的,但我需要显式调用cartService的set方法。我添加了这个方法只是为了测试,现在我想删除它,但如果我没有设置验证器,它就不会被嘲笑。
我怎么能嘲笑它?
答案 0 :(得分:1)
如果这是单元测试:
将测试范围限制为测试单个具体类。考虑通过构造函数(dependency injection)公开类依赖项,或者使用Whitebox与私有内部状态进行混淆,如果您无法提高字段或setter的可见性以将其打包为private以进行测试。
如果此测试是集成测试:
创建一个自定义spring配置(基于xml或pojo),其中注入的依赖项绑定到模拟。也可以注入模拟,以便执行交互验证。要在junit类中使用自定义配置,请参阅此处:
http://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles/
您将要在Junit类
上使用@ContextConfiguration