如何在Spring Boot应用程序中为用@Configuration注释的类编写单元测试用例

vasanthraj devaraju:

我有一个配置类,它为创建bean RedissonClient,也为创建bean CacheManager如何为此配置类创建单元测试用例。

  1. 我们可以为@ConfigurationClass 编写单元测试用例吗?
  2. 如果可以的话,我们需要如何发展。

我更喜欢用Groovy在Spock Framework中编写测试用例。如果没有,请使用Junit或Mockito Framework。如何@Configuration在Spring Boot应用程序中为带注释的类编写单元测试用例

@Configuration
public class CacheConfiguration {
    private static final String CONFIG= "Configuration";

    @Value("${redis.server.url}")
    private String redisUrl;

    @Value("${redis.server.password}")
    private String password;

    @Bean 
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress(redisUrl).setPassword(password);
        RedissonClient client = Redisson.create(config);
        return client;
    }
    @Bean
    public CacheManager redissonCacheManager(RedissonClient redissonClient) {
        Map<String, CacheConfig> config = new HashMap<String, CacheConfig>();
        config.put(CONFIG, new CacheConfig(24*60*1000, 12*60*1000));
        return new RedissonSpringCacheManager(redissonClient, config);
    }

}
马克·布拉姆尼克:

我认为您应该意识到带有注解的类@Configuration并不是真正的Java类,或者至少您不应该这样对待它们。我知道这有争议,我会解释一下...

因此,从历史上看,spring使用XML配置来声明bean。

我猜是在spring 2.5中,他们引入了一个基于注释的方法,您可以在类上添加注解@Component/ @Service@Autowired在您想让spring注入依赖项的任何地方,然后spring启动,扫描类路径,检测bean并使用这些bean启动应用程序上下文。

然后,Spring 3.0 在特殊类中引入了Java配置方式来进行与弹簧相关的配置@Configuration / @Bean

因此,您应该将这些配置类视为对我之前介绍的方法的“替代”

现在让我问,您是否认为应该单独测试XML bean配置?可能不是。。。您认为应该测试该类是否具有注释@Component,并且所有必需的依赖关系都已自动装配(使用反射或其他方法)吗?可能不是。

那么,为什么要测试Java Config类呢?

这是您可能会发现有趣的另一个论点

我已经说过这些类仅用于spring来解析bean,它在内部运行它们。但是spring并不仅仅是“运行”它们-它为它们创建了运行时包装器以克服某些技术问题。这是其中一个例子:

至少假设我们有三个bean:A,B,C,例如B和C取决于A。


class A {}

class B {
   private A a;
   public B(A a) {this.a = a;}
}

class C {
   private A a;
   public C(A a) {this.a = a;}
}

预期所有bean都是单例,因此我们定义如下配置:

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

   @Bean
   public B b() { return new B(a()); }

   public C c() {return new C(a()); }

} 

请注意,我们所说a()的定义BC现在,让我问你一个问题:如果它是一个“正规”的Java代码的两个不同的调用方法如何a()(在B的和C的构造函数)分别应该返回同一个实例A

所以spring确实使用了很多复杂的代码,这实际上是在运行时中运行的,而不是您的类按原样运行,而是它的转换版本,您永远都不知道这些转换是什么,因为它本身就是内部的spring。但是,按原样进行测试有什么意义呢?

我相信还有更多这样的论点,但重点很明确-不要自己测试Configuration类。

相反,您可以使用集成测试,该测试将运行spring容器并加载配置中所需的所有类。但是,在这种情况下,您可能希望模拟某些类(@MockBean例如,使用),因此它不是100%准确的测试。

关于代码覆盖范围-IMO,您应该将这些类完全排除在覆盖范围之外

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为Spring Boot应用程序编写Spock测试用例

使用自动装配的组件为Spring Boot Service应用程序编写JUnit测试用例

如何在 Angular 中为 HTTPClient get() 方法服务编写单元测试用例?

如何为Spring Boot应用程序编写Junit测试用例?

如何使用Mockito为控制器类编写单元测试用例

Spring Boot:如何编写用于删除其余模板的单元测试用例

如何在UIWebView / WebKit中编写单元测试用例(XCTest)-Swift

在 Spring MVC 应用程序中编写测试用例的标准做法是什么?

如何在Docker中为Node.js应用程序设置单元测试?

如何编写Primefaces / JSF应用程序的单元测试

如何在@ComponentScan @Configuration中使用DataSource依赖项对Spring Boot应用程序的控制器进行单元测试

如何为BadRequest编写单元测试用例?

如何为方法编写单元测试用例[Angular]

如何为Perl脚本编写单元测试用例

如何为Android API编写单元测试用例?

单元测试Spring Boot应用程序服务层

Java:Spring Boot、REST 的单元测试用例中的 401 未经授权的测试用例问题

为什么我的Spring应用程序从Spring Boot单元测试中运行

如何在Grails 2.4中编写一个针对特征的Spock单元测试用例?

如何在Spring Boot中编写控制器的单元测试

如何使用 Protractor 测试和编写 ReactJS 应用程序的测试用例?

在Spring Boot应用程序中运行JUnit单元测试而不提供数据源

如何在 Spring Boot 中对 StdDeserializer 进行单元测试?

Spring Boot @Autowired在单元测试用例中不起作用

Spring Boot 中的单元测试用例。服务方法或 Http Urls

如何获得 nodejs 应用程序的代码覆盖率,而无需在推荐的框架中编写测试用例?

如何在Spring中为单元测试创建HttpServletResponse?

我是打字稿、反应和单元测试的新手。如何用玩笑为以下函数编写测试用例?

如何在 angular 7 中使用 jasmine 和 karma 编写单元测试用例