【发布时间】:2017-09-08 14:02:17
【问题描述】:
这是我的 PersonServiceImpl 类。在保存任何人之前,我想运行一些实现 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 注释时,它工作正常。需要一些帮助才能知道我哪里做错了。
【问题讨论】:
-
你用的是spring boot吗?
-
不是答案,但如果您使用了构造函数注入,一切都会变得更简单。你可以使用
new PersonServiceImpl(personDao, Collections.singletonList(personValidator), Collections.singletonList(statusChangeValidator))。 -
Plog 不,我没有使用弹簧靴
标签: java unit-testing junit mockito powermockito