【问题标题】:How Spring unit testing is done with annotation based implementationSpring 单元测试是如何使用基于注解的实现来完成的
【发布时间】:2018-08-08 20:08:01
【问题描述】:

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

现在,我感到困惑的是,当我使用基于注释的配置而不是基于 Spring XML 的 bean 配置时,我将如何实现相同的目标。假设在我的课堂上,如果我将com.abc.TestData 用于src 文件夹下的com.abc.TestData,那么Spring 将始终从src 文件夹中注入TestData 对象,即使我创建了test 文件夹并在那里创建com.abc.TestData_jUnit 那么我也无法注入这个对象。

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

【问题讨论】:

  • 如何区分使用 XML 在测试和生产中注入的实例?使用注解有什么不同?
  • 我的理解是,在测试期间,我将有一个不同的 Spring bean XML 文件,它将测试类注入到 src 文件夹的主类中,并且在生产期间,主 Spring bean XML 文件将在那里将注入真正的课程。现在,我不清楚这将如何与注释一起使用。
  • 如果您的TestData 在您的测试源中,那么类路径扫描将如何在生产中获取它?例如?
  • 对,它不会在 prod 中拾取。它仅在我进行单元测试时才有效。因此,我将拥有我的主测试类,它将创建主应用程序类的对象,然后注入测试数据对象。没有?

标签: java spring


【解决方案1】:

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

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

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

【讨论】:

  • 好的,谢谢您的意见。所以,基本上你是说我将使用构造函数注入进行 DI,spring 将在实际案例/生产场景中注入类,但是对于创建该类的对象时的单元测试,我将明确传递我的测试数据类对象?跨度>
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 2013-07-29
  • 2015-03-25
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多