我有一个配置类,它为创建bean RedissonClient
,也为创建bean CacheManager
。如何为此配置类创建单元测试用例。
@Configuration
Class 编写单元测试用例吗?我更喜欢用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()
的定义B
和C
现在,让我问你一个问题:如果它是一个“正规”的Java代码的两个不同的调用方法如何a()
(在B的和C的构造函数)分别应该返回同一个实例的A
?
所以spring确实使用了很多复杂的代码,这实际上是在运行时中运行的,而不是您的类按原样运行,而是它的转换版本,您永远都不知道这些转换是什么,因为它本身就是内部的spring。但是,按原样进行测试有什么意义呢?
我相信还有更多这样的论点,但重点很明确-不要自己测试Configuration类。
相反,您可以使用集成测试,该测试将运行spring容器并加载配置中所需的所有类。但是,在这种情况下,您可能希望模拟某些类(@MockBean
例如,使用),因此它不是100%准确的测试。
关于代码覆盖范围-IMO,您应该将这些类完全排除在覆盖范围之外
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句