【发布时间】:2018-11-17 15:02:51
【问题描述】:
我有一个用于电子邮件验证的类。该类有两个私有字符串字段,我从application.properties 中注入了其中一个的值。
public class EmailValidation {
private final String someString = "xyz"
@Value("${regex}")
private String emailRegex;
// methods
}
public class EmailValidaitonTest {
private final EmailValidation obj = new EmailValidation();
//missing emailRegex
}
现在我必须为此编写一个单元测试。这个类没有依赖关系,所以我决定在EmailValidationTest 类中使用new 运算符作为类对象。现在,我可以访问字符串someString,但我不能拥有emailRegex 的值,因为它是由Spring 注入的。如何在测试类中设置它的值,并且我希望它的值与我的 application.properties 中的值相同。
【问题讨论】:
-
使用构造函数注入代替字段注入。然后你可以在单元测试中传递你想要的任何正则表达式。如果你想创建一个集成测试并让 Spring 注入属性,那么不要使用
new,而是在你的测试中自动装配 bean。文档是您的朋友。 -
我为该正则表达式字段使用了构造函数注入,但现在如何在测试类中使用
new对其进行初始化,因为它现在需要传递一个字符串。我应该硬编码要传递的字符串吗? @JBNizet -
正如我所说,如果您希望 Spring 注入值,那么您的测试应该是 Spring 测试:docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…。但是首先将正则表达式外部化有什么意义呢?
-
这个值永远不会改变,对吧?它不依赖于环境、配置文件或任何东西,对吧?所以没有理由把它外化。如果有充分的理由将其外部化,则意味着它可以具有任何值,由决定更改值的人决定,因此您的测试不应该关心属性中的具体值:它应该适用于任何值。
-
另外,请注意,Spring Boot 支持的标准 hava bean 验证已经有一个电子邮件验证器,因此您正在重新发明轮子。
标签: java spring unit-testing junit