【问题标题】:Different behaviour when spring is used with junitspring 与junit一起使用时的不同行为
【发布时间】:2020-10-30 18:11:40
【问题描述】:

我使用 spring 5,我看到,当我将 spring 用于测试(使用 junit 5)和主代码时,它的行为不同。最主要的是,当我使用 spring 进行测试时,该单例在启动期间没有被初始化。

例如,这是我的代码

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class Foo<T> {

    public Foo(Class<T> someClass) {
         //...
    }
}

正如所见,这个类在构造函数中需要参数,所以我手动创建它的实例 - context.getBean(....)。当这个类用于测试时 - 一切都很好。但是,当我在主代码中使用它时,我会在春季启动时得到:

NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Class<?>' available: expected at least 1 bean which qualifies as autowire candidate.

这是我的测试示例:

@ExtendWith({SpringExtension.class})
@ContextConfiguration(classes = ContextConfig.class)
public class TestIT {}

如何解释这种不同的行为?我在春季没有太多经验,因此非常感谢您的帮助。

【问题讨论】:

  • spring 的默认作用域是单例!

标签: java spring junit spring-test


【解决方案1】:

NoSuchBeanDefinitionException 表示 Spring 无法在 ApplicationContext 中找到所需的 bean。根据您的 @Component 类 Foo,您有以下选项:

  • 创建一个Type Class的bean,让Spring可以找到它。
  • 移除 Foo 的构造函数,稍后使用 setter 方法设置参数 someClass。
  • 创建不带参数的构造函数并在构造函数中实例化 someClass。

在不了解 someClass 的详细信息的情况下,我无法说最好的选择是什么。

在我的德语博客中,有一篇关于 Spring Basics: Beans & Dependency Injection 的文章,它解释了您尝试做什么的理论:
https://agile-coding.blogspot.com/2020/10/kernkonzepte-von-spring-beans-und.html

PS.:Singleton 是每个 Spring Bean 的默认作用域,您可以删除 @Scope 注释。

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多