@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));
    }
}

问题是 personValidatorsstatusChangeValidators 在我 运行ning 测试时为空。当测试中只有一个 @Spy 注释时,它工作正常。需要一些帮助来了解我哪里做错了。

您的测试没有显示任何静态或决赛模拟,所以我想知道您为什么使用 @RunWith(PowerMockRunner.class)

我已经获取了您的代码并成功 运行 它只做了一个更改:将 @RunWith(PowerMockRunner.class) 替换为 @RunWith(MockitoJUnitRunner.class)

因此,除非您的测试的某些其他方面 需要 PowerMock,否则我建议 运行 使用 MockitoJUnitRunner 设置您的测试用例。如果您的测试的某些方面需要 PowerMock,那么我建议使用显式构造函数注入来注入 statusChangeValidatorspersonValidators 实例(即@JB Nizet 在他上面的评论中建议的),以便您这样做不必依赖 @InjectMocks.

FWIW,有一个 open issue against PowerMock 无法将 @InjectMocks 应用于带有 @Spy 注释的字段。