java - Powermock 模拟类的内部 @Autowired 依赖项

标签 java junit powermock

我在测试中有 @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/

相关文章:

java - HttpUrlConnection 卡住了我的 AsyncTask

java - 有什么方法可以将自定义字段发送到 mongo 存储库进行搜索吗?

android - Robolectric 3 中带有 Play 服务的异步测试代码

Java 11 与 Powermock - 它们兼容吗?

java - ObjectInputStream 消耗过多内存

java - 在没有 maven 或 ant 的情况下在 Jenkins 中自动运行 JUnit 测试

java - Android Base64编解码单元测试返回null

java - 如何使用powermock模拟静态方法?

java - 使用泛型参数模拟静态方法

java - Selenium WebDriver getText