@Spy在两个列表上注释时不起作用



这是我的 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));
    }
}

问题是personValidatorsstatusChangeValidators在我运行测试时为无效。当测试中有单个@Spy注释时,它可以正常工作。需要一些帮助才能知道我做错了什么。

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

我已经使用了您的代码,并仅通过一个更改成功运行它:用@RunWith(MockitoJUnitRunner.class)替换@RunWith(PowerMockRunner.class)

所以,除非您的测试中还有其他一些方面需要 powerMock,否则我建议使用MockitoJUnitRunner运行测试用例。如果您的测试中有一些需要PowerMock的方面,那么我建议将statusChangeValidatorspersonValidators实例注入显式构造函数注入(即@JB Nizet在上面的评论中建议的内容),以便您不必依靠@InjectMocks。/p>

fwiw,针对PowerMock存在一个空旷的问题,因为这种情况无法将@InjectMocks应用于@Spy注释。

相关内容

  • 没有找到相关文章

最新更新