![](/img/trans.png)
[英]Unit test using class with RestTemplate injected with java and spring boot
[英]How to set a value injected by Spring in a unit test?
我正在为 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
的最简单方法是urlPath
,理想情况下(我假设)不更改代码,也不使用 Spring 上下文进行测试?
要对 Spring 组件进行单元测试,您需要使其成员可从外部设置。 最简单的方法是使用构造函数注入。 字段注入要求您运行@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();
}
}
}
}
https://github.com/exabrial/mockito-object-injection
我们创建了一个 JUnit 扩展来解决这个确切的问题。
它很容易使用……请参阅 README.md:
@TestInstance(Lifecycle.PER_CLASS)
@ExtendWith({ MockitoExtension.class, InjectMapExtension.class })
public class MyControllerTest {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.