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

有没有办法防止在Spring中从config注入依赖项?

通飞尘
2023-03-14

我正在从事一个Spring项目,其中单元测试有自己的配置,称为UnitTestConfig,它有几个定义类似于主应用程序文件的bean(几乎是一个副本)。保持结构不变,我正在对主应用程序服务器代码进行一些更改,但是这会在UnitTestConfig中引发错误,因为它没有注入所需的bean。这些bean没有在单元测试中使用,有没有办法阻止UnitTestConfig尝试注入这些bean?这是一个巨大的卡萨卡德效应,因为a注入,B注入,等等,它期待着所有这些豆子。我能告诉Spring配置我不想注入这些bean或将它们设为null吗?

@Configuration
public class UnitTestConfig {

    @Inject
    private Environment env;

    @Bean
    public A a() {
        return new A();
    }

为了不在需要时注入A的字段,我在字段上添加了一个@Lazy,它似乎可以工作,但我希望对此进行的任何修改都在测试配置端,而不是修改主要应用程序代码来修复测试问题。有什么建议吗?

共有2个答案

齐财
2023-03-14

这是大多数应用程序的一个非常常见的问题,随着应用程序的增长,添加具有通用配置的单元测试变得困难。运行单元测试成为一场噩梦,因为您必须处理不必要的上下文加载。

我们最终开始有测试配置文件,以解决加载不必要的bean的问题。并且仅为某些配置文件加载bean。类似这样的东西-

如何在Spring中禁用使用@组件注释创建bean?

但是这可能会产生自己的问题——创建多个配置文件并管理这些配置文件。如果管理配置文件不是问题,这可以帮助您。

或者,我们停止使用公共上下文进行单元测试,开始使用静态测试上下文类隔离测试类,并模拟所有不需要的bean。像这样的-

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class SomeJavaClassTest {

    @Autowired
    private Bean1 bean1;
    @Autowired
    private Bean2 bean2;
    @Autowired
    private Bean3 bean3;
    
    @test
    public void method1Test() throws Exception {
    }
    
    @test
    public void method2Test() throws Exception {
    }
    
    @Configuration
    static class Config {
    
        @Bean
        public Bean1 bean1() {
            return Mockito.mock(Bean1.class);
        }

        @Bean
        public Bean2 bean2() {
            return new SomeJavaClass();
        }
        
        @Bean
        public Bean3 bean3() {
            return Mockito.mock(Bean3.class);
        }
    
        @Bean
        public PropertySourcesPlaceholderConfigurer properties() throws Exception {
            PropertySourcesPlaceholderConfigurer propertyPlaceholder = new PropertySourcesPlaceholderConfigurer();

            // setup properties that needs to be injected into the class under test

            Properties properties = new Properties();
            properties.setProperty("some.required.properties", "");
            
            propertyPlaceholder.setProperties(properties);

            return propertyPlaceholder;
    }
}
夏朗
2023-03-14

这被称为循环bean依赖。有很多方法可以解决这个问题。在构造函数参数中使用@Lazy注释。而不是构造函数注入器使用setter注入或在application.properties文件中写入spring.main.allow-bean-定义-覆盖=true

 类似资料:
  • 我正在运行一个使用TestNG作为测试框架的Spring Boot应用程序。我的测试是这样设置的: 父类,负责设置逻辑并负责所有配置内容: 有多个子测试类。每个on继承父测试类,因此它们共享相同的设置逻辑。 问题是:以前我使用的是注释,这意味着父类的设置方法为每个子测试类运行一次。这是可以的,但等待相同的设置运行多次确实很慢。 所以我想:我将把ParentTestClass中的注释改为!那会解决我

  • 在不讨论原因的情况下,假设有人想要一个老式的Play Framework web服务,并且不想使用依赖注入,也不想依赖Google的Guice。在玩法2.8.x中还可能吗? 有没有一个简单的方法可以让你不去这里就呆在老学校里? 我承认,但不完全理解https://www.playframework.com/documentation/2.4.x/migration24。我认为我的问题与2.7中删除

  • 我正在使用spring官方教程中的示例进行实验,并且对此代码有一个依赖关系: https://github.com/spring-guides/gs-async-method/tree/master/complete 如果您查看类上的代码,我有两个问题: 当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样,是由spring使用配置的bean提供的。但是,构造函数上没有注释

  • 问题内容: 当前在app.js中,我有以下路线: 如您所见,我正在尝试注入Path依赖项。尽管我收到一条错误消息,说找不到该提供程序。我认为这是因为配置模块提供程序首先执行。以下是“ services.js”中我的路径提供程序定义 我怎样才能将此提供程序注入配置模块? 问题答案: 在中,只能使用提供程序(例如)。在你只能使用服务(如实例)。您有一家工厂,而不是供应商。请参阅具有以下三种创建方式的代

  • 考虑此代码GITHUB: Spring模式示例代码 如果您签出第3章-依赖注入,项目中没有任何主类。 我做了一个 mvn清洁安装 这是成功的。 当我执行jar时,我得到以下错误: bash-3.2$java-jar./Target/第-03-Spring-依赖-注入-0.0.1-SNAPSHOT. jar 没有主清单属性,在./Target/第-03-Spring-依赖-注入-0.0.1-SNAP

  • 我喜欢用于bean声明等的注释,但现在我们有这么多具有顺序的bean(@取决于)。很难维护或浏览配置。 是否有任何工具可以根据您的所有bean注释提供“有效的Spring配置”信息?