Spring引导@SpyBean尝试实例化一个新bean,而不是在上下文中监视一个bean

时间:2016-12-12 15:10:36

标签: spring junit spring-boot spring-batch

我正在尝试使用JUnit对Spring引导内的Spring批处理作业进行单元测试。 我写了这个测试类,我想监视bean的ItemReader:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
@ActiveProfiles({"dev", "batch", "test-jobs"})
public class BatchJobTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    private @Autowired @Qualifier("contactDownloadAckJob") Job contactDownloadAckTaskJob;

    @SpyBean
    private ItemReader<CrsOscContact> reader;

    @Test
    public void testJob() throws Exception {
        given(this.reader.read()).willReturn(new CrsOscContact());
        //... blah blah blah
    }   

}

当我运行这个测试时,似乎@SpyBean注释没有完成它的工作,它应该代理已经存在于上下文中的ItemReader bean,因此我获得了(正确的)异常,因为,根据定义,如果找不到bean,它会尝试实例化该类型的新bean(我已经指定了一个接口):

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.batch.item.ItemReader]: Specified class is an interface

我很确定bean(ItemReader类型)已经在上下文中了,因为:

  • 调试,我看到目标bean实例化已正确处理
  • 如果我将@SpyBean注释更改为@Autowired注释,则会正确注入前一个点的实例

任何提示?谢谢

1 个答案:

答案 0 :(得分:1)