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

标签 java unit-testing junit mockito powermockito

这是我的PersonSeviceImpl类。在保存任何人之前,我想运行一些实现 PersonValidator 的 validator 。我还 Autowiring 了 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;
    }
}

这里我正在编写测试来验证 validator 是否被调用。

@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 注释时,它工作正常。需要一些帮助才能知道我哪里做错了。

最佳答案

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

我已经获取了您的代码并成功运行它,只需进行一项更改:替换 @RunWith(PowerMockRunner.class)@RunWith(MockitoJUnitRunner.class) .

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

FWIW,有一个 open issue against PowerMock由于无法申请@InjectMocks对于带有 @Spy 的字段注释。

关于java - @Spy 在两个列表上注释时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46118316/

相关文章:

java - 用于 API 不同部分的多个 ObjectMapper

java - 插入到 LinkedList 的 ArrayList

java - struts中的文件上传

java - PDFBox:PDDocument 和 PDPage 是否相互引用?

unit-testing - 单元测试与验收测试

java - 没有为参数 [io.vertx.ext.unit.TestContext arg0] 注册 ParameterResolver

c# - 单元测试自定义 IHttpactionResult

java - 最大限度地减少单元测试期间的对象保留

java - JUnit-Test 类测试和项目测试之间存在差异

java - 使用 powermockito 验证静态 void 方法的调用