我在测试中有 @Autowired
依赖项,其中还有另一个 @Authowwired
依赖项。我正在使用
@RunWith(SpringJUnit4ClassRunner.class)
和
@Rule
public PowerMockRule rule = new PowerMockRule();
为了在我的测试中获得 spring 上下文。
我需要模拟 @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 方法。我添加此方法只是为了测试,现在我想删除它,但如果我没有设置 validator ,它就不会被 mock 。
我怎样才能 mock 它?
最佳答案
如果这是单元测试:
将测试范围限制为测试单个具体类。考虑通过构造函数 ( dependency injection ) 或使用 Whitebox 公开类依赖项如果您无法提高字段或 setter 的可见性来打包私有(private)以进行测试,那么就会破坏私有(private)内部状态。
如果此测试是集成测试:
创建一个自定义 spring 配置(基于 xml 或 pojo),其中注入(inject)的依赖项绑定(bind)到模拟。还要注入(inject)模拟,以便您可以执行交互验证。要在 junit 类中使用自定义配置,请参阅此处:
http://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles/
您将希望在 Junit 类上使用 @ContextConfiguration
关于java - Powermock 模拟类的内部 @Autowired 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22654619/