如何在 Spring 中测试 @Configuration 类而不启动整个上下文?

Posted

技术标签:

【中文标题】如何在 Spring 中测试 @Configuration 类而不启动整个上下文?【英文标题】:How to test @Configuration class in Spring without starting up whole context? 【发布时间】:2022-01-18 17:56:41 【问题描述】:

如何在不启动整个 Spring 上下文类的情况下测试我的配置,还是应该这样做?

@Configuration
public class GaRuConfig 

    @Bean
    public List<GaRu> rules()
        s-s-rule rule1 = new s-s-rule();
        CSRule rule2 = new CSRule();
        DGRule rule3 = new DGRule();
        EGRule rule4 = new EGRule();

        return List.of(rule1, rule2, rule3, rule4);
    

有没有办法测试这个类?

【问题讨论】:

只需为您的rules() 进行单元测试或任何其他方法可用? 你到底想测试什么? rules() 返回预期的 List&lt;GaRu&gt;? 【参考方案1】:

使用AssertJ,您可以执行以下操作:

public class GaRuConfigTest 

    private GaRuConfig gaRuConfig = new GaRuConfig();

    @Test
    public void shouldReturnCorrectListOfRulesWhenRequested() 
        // Act
        List<GaRu> rules = this.gaRuConfig.rules();

        // Assert
        Assertions.assertThat(rules.stream().filter(rule -> s-s-rule.class == rule.getClass()).collect(Collectors.toList())).isNotEmpty();
        Assertions.assertThat(rules.stream().filter(rule -> CSRule.class == rule.getClass()).collect(Collectors.toList())).isNotEmpty();
        Assertions.assertThat(rules.stream().filter(rule -> DGRule.class == rule.getClass()).collect(Collectors.toList())).isNotEmpty();
        Assertions.assertThat(rules.stream().filter(rule -> EGRule.class == rule.getClass()).collect(Collectors.toList())).isNotEmpty();
        
        Assertions.assertThat(rules).hasSize(4);
        Assertions.assertThat(s-s-rule.class == rules.get(0).getClass()).isTrue();
        Assertions.assertThat(CSRule.class == rules.get(1).getClass()).isTrue();
        Assertions.assertThat(DGRule.class == rules.get(2).getClass()).isTrue();
        Assertions.assertThat(EGRule.class == rules.get(3).getClass()).isTrue();
    

【讨论】:

你能告诉我如何检查规则的顺序吗? 已更新,请查看;) 在这个简单的示例中,它可以简单地实例化 Configuration 类。虽然一旦你使用 Spring 魔法(@Autowired@Value,...),情况就不再如此了。那么我将使用仅具有该配置的@SpringBootTest。 同意,但只测试配置类就足够了。更多的测试是测试 Spring Framework 而不是 OP 代码。【参考方案2】:

您可以仅使用一个(或几个)配置类来启动 Spring 上下文:

@SpringBootTest
@ContextConfiguration(classes = GaRuConfig.class, MyTestConfig.class)
public class GaRuConfigTest 
   @Autowired
   private List<GaRu> rules

   @Test
   public void testSomething() 
      // assertion on the rules
   

   @TestConfiguration
   static class MyTestConfig 
     //... overwriting some beans you want to have changed for your test
   


这只会使用该配置类启动 ApplicationContext。

如果您想测试您的配置是否与 Spring 基础架构结合使用(在您的示例中并非如此),这将特别有用。通过该测试,您可以验证是否存在 List&lt;GaRu&gt; 类型的 bean,并且可以将其自动装配到其他类中。

只启动应用程序的一部分(与整个应用程序相比)更便宜,而且您仍然可以检查这部分是否正确自动装配,可能会使用特定的@TestConfiguration 覆盖您生产配置的一些 bean .

【讨论】:

你能给我看一个使用@TestConfiguration的例子吗?顺便谢谢你的回答 扩展示例。 @Configuration 的不同之处在于,您可以声明具有相同名称的 bean,从而覆盖您的生产 bean(而不是抛出错误,@Configuration 就是这种情况)

以上是关于如何在 Spring 中测试 @Configuration 类而不启动整个上下文?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot集成redis

Spring 5 LDAP 身份验证和 JWT 令牌作为响应

spring纯注解+libreoffice

spring-boot-devtools在Idea中热部署方法

Spring零配置之@Configuration注解详解

sh Configuraçãodocouchdb