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

@Autowired或构造函数将非托管类注入Spring context@Service,以便更好地进行测试

裴星洲
2023-03-14

在Spring Boot项目中,我们通过静态方法访问非托管DAO类:

MyDao myDao = DaoProvider.getMyDao();

我们在Spring管理的@Service类中使用这个:

@Service
public class MyService {
    
    public void foo() {
        MyDao myDao = DaoProvider.getMyDao();
        myDao.bar();
        ....
    }
}

这使得编写单元测试变得困难。静态模拟是没有选择的,因为它们减慢了我们的构建管道。

我们更希望有一个解决方案,它具有@autowed或构造函数依赖关系和某种配置,可以决定注入哪个类:

@Service
public class MyService {
    
    @Autowired
    MyDao myDao;
    
    public void foo() {
        myDao.bar();
        ....
    }
}

显然,必须有人告诉Spring要注入什么类,有什么方法吗

public class NonManagedSpringInjectionConfiguration {
    
    @Bean
    MyDao getMyDao() {
        return DaoProvider.getMyDao();
    }
}

共有1个答案

龚招
2023-03-14

你只需要指定profile例如:

@Configuration
public class NonManagedSpringInjectionConfiguration {
    
    @Bean
    @Profile("dev")
    MyDao getMyDao() {
        return DaoProvider.getMyDao();
    }
}
 类似资料:
  • 我刚开始学习Dagger2,以解决一个特定的问题:我试图遵循MVVM架构,我的应用程序有一个存储库类,它将设置提取并保存在一个基本上包装SharedPreferences的CacheData类中。但是,SharedPreferences具有上下文相关性。由于我已经完成了将存储库和数据层与视图和应用程序类解耦的所有工作,传递上下文似乎是一种倒退。 下面是存储库类 应用程序类: 是否可以使用Dagge

  • 问题内容: 我已经用策略模式实现了一个程序。所以我有一个在某些地方使用的接口,并且可以替换具体的实现。 现在我要测试该程序。我想以类似的方式做。编写一次测试,针对该接口进行测试。应在测试开始时注入具体的接口实现,以便我可以轻松地替换它。 我的测试类看起来与此类似: 在开始测试时,必须使用参数化的构造器来注入具体的策略实施。 现在我没有让TestNG运行它并注入具体的实现实例。我试图与继承几种方法,

  • 我需要重构现有的抽象类来实现依赖注入,但是这个类有两个接受其他参数的构造函数。 我需要注入一些接口,并避免在构造函数中传递任何其他参数,如“settingsId”和“Setting”。所以我的想法是在创建此类的实例后创建两种方法来设置这些参数。 但它看起来不是一个合适的解决方案,因为如果开发人员忘记在创建实例后运行这些方法之一,我们将来可能会得到一个异常(对象未设置为引用...)。我应该如何正确执

  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。