Java Powemock模拟类的内部@Autowired依赖项

Java Powemock模拟类的内部@Autowired依赖项,java,junit,powermock,Java,Junit,Powermock,我在测试中有@Autowired依赖项,其中有另一个@Authowired依赖项。我正在使用 @RunWith(SpringJUnit4ClassRunner.class) 及 为了在我的测试中获得spring上下文 我需要模拟@Autowired成员的内部依赖关系。我可以通过编写以下代码来实现这一点: @Autowired private CartService cartService; private MyValidator validator; @Test public void

我在测试中有
@Autowired
依赖项,其中有另一个
@Authowired
依赖项。我正在使用

@RunWith(SpringJUnit4ClassRunner.class) 

为了在我的测试中获得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方法。我添加这个方法只是为了测试,现在我想删除它,但是如果我没有设置验证器,它就不会被模拟


我怎样才能模拟它呢?

如果这是一个单元测试:

将测试范围限制为测试单个混凝土等级。考虑通过构造函数()来公开类依赖项,或者如果不能增加字段或设置程序的可见性来封装私有的内部测试,则使用它来与私有内部状态进行共享。p> 如果此测试是集成测试:

创建一个自定义spring配置(基于xml或pojo),其中注入的依赖项绑定到mock。同时注入模拟,以便可以执行交互验证。要在junit类中使用自定义配置,请参见此处:


您将要在Junit类上使用@ContextConfiguration

我尝试使用WhiteBox,但在定义为接口的@Autowired服务中,我得到了异常:org.powermock.reflect.exceptions.FieldNotFoundException:没有名为“validator”的实例字段可以在CartService的类层次结构中找到。如果spring正在为您注入对象,然后,我将为您的测试提供一个单独的spring配置文件,该文件将验证器绑定到一个mock,或者将setter留在其中,但会降低包private的可见性,并记录它仅在测试时可见。如果测试是一个单元测试,我不想让spring注入所有东西,而只是直接使用Whitebox或DI实例化/测试实现类,在具体的impl类上播种我的模拟对象,在测试
@ContextConfiguration
中设置一个spring上下文,它支持组件扫描,并具有模拟的验证程序bean。您可以调用Powermock工厂方法来创建模拟bean。
@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();
}