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

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

夏和雅
2023-03-14
    null
@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);
    }

}

共有1个答案

孙永思
2023-03-14

我认为您应该意识到,用@configuration注释的类并不是真正的java类,或者至少您不应该这样对待它们。我知道这听起来很有争议,我会解释的...

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

我想在Spring2.5中,他们引入了一种基于注释的方法,在这种方法中,您将注释@component/@service放在类上,将@autowired放在希望spring注入依赖项的任何地方,然后spring启动,扫描类路径,检测bean,并用这些bean启动应用程序上下文。

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

现在让我问一下,您认为您应该测试和XML bean配置本身吗?可能不是...你认为你应该测试这个类上有注释@component,并且所有必要的依赖都是autowired(带有反射或其他)吗?可能不会。

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

不要假设我们有三个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()); }

} 

请注意,我们在BC的定义中调用a()现在,让我问您一个问题:如果它是一个“常规”java代码,那么方法a()的两个不同调用(在B和C的构造函数中)如何分别返回a的同一个实例?

我相信还有更多类似的参数,但要点很清楚--不要单独测试配置类。

相反,您可以使用集成测试来运行spring容器并加载配置中所需的所有类。但是,在这种情况下,您可能希望模拟一些类(例如使用@mockbean),这样就不会是一个100%准确的测试。

在代码覆盖率方面,IMO应该将这些类完全排除在覆盖率之外

 类似资料:
  • 我在SpringBoot中开发微服务。为服务和DAO层编写单元测试。当我使用@SpringBootTest时,它会在构建时启动应用程序。但是当我运行单元测试时,它不应该启动应用程序。我使用了@runwith(Springrunner.class),但无法在junit类中使用@autowired类实例。如何配置不应该启动应用程序的junit测试类,以及如何在junit类中@Autowired类实例。

  • 我想配置一个Spring Boot应用程序,以便根本不使用DB。因此,我对应用程序类进行了注释,以排除JPA自动配置类: 原因:org.springframework.beans.factory.BeanCreationException:创建名为“data source”的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalStateException:无法为测试确

  • 我想为上面的内容编写单元测试,以测试我正在使用的注释的sampleURL,比如如果我给出任何应该与regex模式匹配的URL。我浏览了以下链接:如何在spring中进行单元测试验证注释,如何使用JUnit测试类的验证注释?但它们没有多大帮助,我也有setSampleURL函数。那么,如何为sampleURL变量编写测试呢。基本上,我想为regex模式编写测试,即我给sampleURL的值是否与re

  • 在尝试连接数据库并获得连接尝试失败时,所有这些测试用例都失败了。和异常,因为它没有获取信息。 我对spring boot framework和JUnit几乎是新手,希望帮助我理解这一点以及编写单元测试用例的正确方法。

  • 我有一个处理jwt创建的类: 并从resources文件夹中的属性文件中获取jwtSecret和jwtExpirationInMs。 我的单元测试如下所示:

  • 我一直在学习使用Jest库编写JavaScript/TypeScript代码的单元测试。下面是一个我不知道如何处理的例子。它是用TypeScript输入的——只有两个公共方法和一个构造函数需要service1参数。 我想我需要测试两种情况: > 如果 函数为空。我没有在代码中看到它的任何实现,也不知道它是如何工作的。我应该把它作为参数传递给这个类的实例吗? 我很困惑,在这个特定的例子中,我应该使用