这是我的 perseviceimpl class。在保存任何人之前,我想运行一些实现 PersonValidator 的验证器。我也可以自动自动 PersonStatusChangeValidator 用于其他方法。
public class PersonServiceImpl implements PersonService {
@Autowired
PersonDao personDao;
@Autowired
List<PersonStatusChangeValidator> statusChangeValidators;
@Autowired
List<PersonValidator> personValidators;
@Override
public Person save(Person person) {
for(PersonValidator validator: personValidators){
validator.validate(person);
}
personDao.save(person);
return person;
}
}
在这里,我正在编写测试以验证验证器是否被调用。
@RunWith(PowerMockRunner.class)
public class PersonServiceImplTest {
@Mock
private PersonDao personDao;
@Mock
private PersonValidator personValidator;
@Mock
private PersonStatusChangeValidator statusChangeValidator;
@Spy
private List<PersonStatusChangeValidator> statusChangeValidators = new ArrayList<>();
@Spy
private List<PersonValidator> personValidators = new ArrayList<>();
@InjectMocks
private PersonServiceImpl personService;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
personValidators.add(personValidator);
statusChangeValidators.add(statusChangeValidator);
}
@Test
public void testCreatePerson() throws Exception {
personService.save(new Person());
verify(personValidator, times(1)).validate(any(Person.class));
}
}
问题是personValidators
,statusChangeValidators
在我运行测试时为无效。当测试中有单个@Spy
注释时,它可以正常工作。需要一些帮助才能知道我做错了什么。
您的测试没有显示静态或决赛的任何模拟,所以我想知道为什么您使用@RunWith(PowerMockRunner.class)
?
我已经使用了您的代码,并仅通过一个更改成功运行它:用@RunWith(MockitoJUnitRunner.class)
替换@RunWith(PowerMockRunner.class)
。
所以,除非您的测试中还有其他一些方面需要 powerMock,否则我建议使用MockitoJUnitRunner
运行测试用例。如果您的测试中有一些需要PowerMock的方面,那么我建议将statusChangeValidators
和personValidators
实例注入显式构造函数注入(即@JB Nizet在上面的评论中建议的内容),以便您不必依靠@InjectMocks
。/p>
fwiw,针对PowerMock存在一个空旷的问题,因为这种情况无法将@InjectMocks
应用于@Spy
注释。