我一直在学习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/