当前位置: 首页 > 知识库问答 >
问题:

Spring boot@SpyBean试图实例化一个新bean,而不是在上下文中监视这个bean

宿建本
2023-03-14

我试图使用JUnit在Spring boot中对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个答案

锺离阿苏
2023-03-14

这是一个Spring Core问题,现已修复。

https://github.com/spring-projects/spring-boot/issues/7625

https://jira.spring.io/browse/SPR-15011

 类似资料:
  • 我想不通..出于某种原因,Spring Junit没有将我的bean添加到上下文中。请砰!! 由:org.springframework.beans.factory.nosuchBeanDefinitionException引起:没有类型为“com.api.demo.store.FileStorage”的合格bean可用:需要至少有1个bean作为autowire候选bean。依赖项注释:{@or

  • 这些文本文件包含数行,每行16个数字。预演 我不明白!这些应该是图像(像素值的矩阵)吗? 代表链接:https://github.com/Kurispy/neuralnet

  • 我有三节课。 > 一个抽象类,abstractA有一个受保护的构造函数 一个类扩展了抽象类,父类有两个构造函数 一个类扩展父类,子类有一个构造函数 这是从抽象类扩展而来的父类 这是从父类扩展而来的子类 自定义组件看起来像这样 所以,当spring为特定测试实例化所有bean时,它会正确地实例化子bean。当父bean被实例化时,它得到2个bean[父和子]。所以,我最终会出错, 类型父的多个bea

  • 我正在我的应用程序中使用ViewPager进行滑动效果。 我使用pager.setPageMargin()使下一个视图和上一个视图可见,不幸的是我的下一个视图与当前视图重叠。 下面是我的代码 我在用寻呼机里的片段。我得到的输出与这个线程的附加,但需要视图被适当地放置与out over lapping 上图所标部分应在中心卡后面。

  • 当应用程序启动时,会引发两个上下文:一个用于事件,另一个用于事件,并且一切正常,派遣员上下文使用“父”bean而不是创建它自己的。当我使用(我使用rest api请求调用它)启动Spring上下文刷新时,只发送了一个ContextRenewEvent(第一个),当我尝试访问任何servlet组件(rest控制器)时,派遣员开始创建自己的bean,尽管刷新后创建了“主”bean。再次没有为派遣员上下

  • 这类似于@inject每次使用时都注入一个新实例,但我在那个线程中找不到答案。 我对CDI和JSF都很陌生,我正在尝试使用CDI而不是JSF注释。我想从MemberController检索凭据。bean本身(两者)都是从jsf页面调用的。问题是MemberController中的Credential实例的名称/密码总是为空,即使我确认Credential中的setter被命中。我不明白为什么有两个