如何在 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<GaRu>
?
【参考方案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<GaRu>
类型的 bean,并且可以将其自动装配到其他类中。
只启动应用程序的一部分(与整个应用程序相比)更便宜,而且您仍然可以检查这部分是否正确自动装配,可能会使用特定的@TestConfiguration
覆盖您生产配置的一些 bean .
【讨论】:
你能给我看一个使用@TestConfiguration的例子吗?顺便谢谢你的回答 扩展示例。 @Configuration 的不同之处在于,您可以声明具有相同名称的 bean,从而覆盖您的生产 bean(而不是抛出错误,@Configuration 就是这种情况)以上是关于如何在 Spring 中测试 @Configuration 类而不启动整个上下文?的主要内容,如果未能解决你的问题,请参考以下文章
Spring 5 LDAP 身份验证和 JWT 令牌作为响应