java - Spring单元测试是如何通过基于注解的实现来完成的

标签 java spring

我一直在学习Spring,我的理解是Spring最大的优点是它简化了单元测试,因为它的依赖注入(inject)特性......这是我的理解,如果我错了请纠正我 - 假设我在我的 Spring bean XML 文件中拥有所有 bean 配置,并且在 src 文件夹下拥有所有类,现在如果我想进行单元测试(独立或通过 junit),那么我将注入(inject)测试类(具有通过为我的测试类定义 Spring bean 配置文件,将测试数据)添加到主类中。

现在,我感到困惑的是,当我使用基于注释的配置而不是基于 Spring XML 的 bean 配置时,我将如何实现相同的目标。假设在我的类中,如果我对 src 文件夹下的 com.abc.TestData 使用了 @Autowired 那么 Spring 将始终注入(inject) TestData 对象来自 src 文件夹,即使我创建 test 文件夹并在那里创建 com.abc.TestData_jUnit 然后我也将无法注入(inject)该对象。

那么,这是否意味着当使用注释而不是 Spring bean XML 文件时,Spring 简化单元测试的优势就会消失?我很确定情况并非如此,因此需要您的帮助才能更好地理解事情。

最佳答案

答案是使用构造函数DI而不是Setter DI。不要将各个 private 字段注释为 @Autowired,而是注释构造函数。 Spring 将根据需要填充所需的 bean(使用 @Named 来解决具有相同类型的 bean 之间的任何歧义)。

然后,在单元测试中,声明一个用 @Before 注释的 setup() 方法,并显式创建正在测试的对象,并在构造函数 - 基本上做同样的事情,如果你让它动态创建它,Spring 也会做同样的事情。当然,您传递到构造中的值本身可以在其字段声明中使用 @Autowired 注入(inject)到您的单元测试类中。

或者,您可以使用Spring Profiles,结合@Configuration类来根据执行配置文件配置不同的bean环境,并将不同的具体bean注入(inject)到您的应用程序中。正在测试的类。

关于java - Spring单元测试是如何通过基于注解的实现来完成的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51754832/

相关文章:

java - 如何让文本显示在我的矩形中,但我什至无法显示矩形?

java - Spring Cloud AWS cglib问题

java - 如何验证 Person 类中的输入

java - 使用 spring mvc 中的 Display 标签将数据导出到 Excel、PDF、CSV 和 XML 的示例

java - @RequestMapping 多个页面

java - Spring Batch 多线程数据库读取器

java - 为什么我们不能在 Map Reduce 中使用 Java 原始数据类型?

Spring Integration Junit Bridge 到 testChannel 的直接 channel

java - Spring Validator : Could not autowire. 找不到 'Validator' 类型的 beans

Java 8 方法引用多个不同的构造函数