@Spy在两个列表上注释时无法正常工作

时间:2017-09-08 14:02:17

标签: java unit-testing junit mockito powermockito

这是我的 PersonSeviceImpl 类。在保存任何人之前,我想运行一些实现 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在我运行测试时为空。当测试中有一个@Spy注释时,它工作正常。需要一些帮助才能知道我在哪里做错了。

1 个答案:

答案 0 :(得分:1)

您的测试没有显示任何静态或决赛的嘲笑,所以我想知道您使用@RunWith(PowerMockRunner.class)的原因?

我已经接受了您的代码,只需一次更改即可成功运行:将@RunWith(PowerMockRunner.class)替换为@RunWith(MockitoJUnitRunner.class)

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

FWIW,open issue against PowerMock无法对@InjectMocks注释的字段应用@Spy