@Spy 在两个列表上注释时不起作用
@Spy not working when annotated on two lists
这是我的 PersonSeviceImpl 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
在我 运行ning 测试时为空。当测试中只有一个 @Spy
注释时,它工作正常。需要一些帮助来了解我哪里做错了。
您的测试没有显示任何静态或决赛模拟,所以我想知道您为什么使用 @RunWith(PowerMockRunner.class)
?
我已经获取了您的代码并成功 运行 它只做了一个更改:将 @RunWith(PowerMockRunner.class)
替换为 @RunWith(MockitoJUnitRunner.class)
。
因此,除非您的测试的某些其他方面 需要 PowerMock,否则我建议 运行 使用 MockitoJUnitRunner
设置您的测试用例。如果您的测试的某些方面需要 PowerMock,那么我建议使用显式构造函数注入来注入 statusChangeValidators
和 personValidators
实例(即@JB Nizet 在他上面的评论中建议的),以便您这样做不必依赖 @InjectMocks
.
FWIW,有一个 open issue against PowerMock 无法将 @InjectMocks
应用于带有 @Spy
注释的字段。
这是我的 PersonSeviceImpl 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
在我 运行ning 测试时为空。当测试中只有一个 @Spy
注释时,它工作正常。需要一些帮助来了解我哪里做错了。
您的测试没有显示任何静态或决赛模拟,所以我想知道您为什么使用 @RunWith(PowerMockRunner.class)
?
我已经获取了您的代码并成功 运行 它只做了一个更改:将 @RunWith(PowerMockRunner.class)
替换为 @RunWith(MockitoJUnitRunner.class)
。
因此,除非您的测试的某些其他方面 需要 PowerMock,否则我建议 运行 使用 MockitoJUnitRunner
设置您的测试用例。如果您的测试的某些方面需要 PowerMock,那么我建议使用显式构造函数注入来注入 statusChangeValidators
和 personValidators
实例(即@JB Nizet 在他上面的评论中建议的),以便您这样做不必依赖 @InjectMocks
.
FWIW,有一个 open issue against PowerMock 无法将 @InjectMocks
应用于带有 @Spy
注释的字段。