java - 如何在单元测试中设置 Spring 注入的值?
问题描述
我正在为 Spring 管理的以下类编写单元测试:
@Component
public class MyClass {
@Value("${urlValue}")
private String urlPath;
private MyUrl url = new MyUrl(urlPath);
public class MyUrl {
MyUrl(String url) {
if (url == null) {
throw new NullPointerException();
}
}
}
}
我正在尝试以urlValue
最简单的方式进行测试。我尝试了以下方法:
public class MyClassTest {
private MyClass mc;
@Before
public void setUp() {
mc = new MyClass();
ReflectionTestUtils.setField(mc, "urlPath", "urlValue");
}
@Test
public void test() {
}
}
然而,反射设置失败,因为它来得太晚(new MyUrl()
之前调用并抛出异常)。什么是最简单的设置方法urlPath
,理想情况下(我假设)不更改代码,也不使用 Spring 上下文进行测试?
解决方案
要对 Spring 组件进行单元测试,您需要使其成员可从外部设置。最简单的方法是使用构造函数注入。字段注入需要您运行 a @SpringBootTest
,这会使您的单元测试速度慢得不合理,因为它会创建一个 Spring 上下文。
看看这里:spring boot 中的单元测试指南
你可以这样做(没有检查正确性):
@Component
public class MyClass {
private String urlPath;
private MyUrl url;
public MyClass(@Value("${urlValue}") String urlPath) {
this.urlPath = urlPath;
this.url = new MyUrl(urlPath)
}
public class MyUrl {
MyUrl(String url) {
if (url == null) {
throw new NullPointerException();
}
}
}
}
推荐阅读
- ruby-on-rails - Minitest + Capybara:如何检查选项列表是否不包含选项?
- r - 按最接近的日期连接两个数据框而不在 R 中遍历
- anaconda - 当安装的包使用 conda 虚拟环境时,如何使 Python 控制台脚本入口点工作?
- python - 如何解决此错误?AttributeError:“builtin_function_or_method”对象没有属性“数据”
- c# - C# 中的非阻塞 OpenGL (OpenTK) 游戏循环
- java - java.lang.NumberFormatException:对于输入字符串 {Date}。Spring MVC 我无法识别错误
- python - How to customize Keras layer names and also have it automatically increment layer.name
- html - 如何在任意大小的框中将最大圆居中?
- css - Chrome 开发工具:识别被覆盖样式的来源
- c++ - 非常量引用返回函数被用作 r 值而不是 const 值返回函数