java - Junit 5,Mockito,构造函数不初始化值
问题描述
我正在尝试执行简单的单元测试,但是我有一个有点问题的构造函数,其中字符串是在通过@Value 注入期间创建的。组件字段和构造函数的实现如下所示:
private final RestTemplate restTemplate;
private final ObjectMapper mapper;
private final String movieServiceUrl;
private final String recommendationServiceUrl;
private final String reviewServiceUrl;
@Autowired
public MovieCompositeIntegration(
RestTemplate restTemplate,
ObjectMapper mapper,
@Value("${app.movie-service.host}") String movieServiceHost,
@Value("${app.movie-service.port}") int movieServicePort,
@Value("${app.recommendation-service.host}") String recommendationServiceHost,
@Value("${app.recommendation-service.port}") int recommendationServicePort,
@Value("${app.review-service.host}") String reviewServiceHost,
@Value("${app.review-service.port}") int reviewServicePort
) {
this.restTemplate = restTemplate;
this.mapper = mapper;
movieServiceUrl = "http://" + movieServiceHost + ":" + movieServicePort + "/movie/";
recommendationServiceUrl = "http://" + recommendationServiceHost + ":" + recommendationServicePort + "/recommendation?movieId=";
reviewServiceUrl = "http://" + reviewServiceHost + ":" + reviewServicePort + "/review?movieId=";
}
首先,我认为可以通过使用 @TestPtopertySource 注释来实现使用模拟属性,但是这是无法做到的,因为这些字段就像movieServiceUrl 一样不能被模拟,因为它们是最终的。所以我坚持认为,与其在 MovieCompositeIntegration 类上模拟和使用 @InjectMocks 相比,不如硬编码它的构造函数,例如:
@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
movieCompositeIntegration = new MovieCompositeIntegration(
restTemplate,
mapper,
"localhost", 7001,
"localhost", 7001,
"localhost", 7001
);
}
构造函数的逻辑应该用这个硬编码的值初始化,但是它会返回 NPE 作为结果。
@Test
void getUrl() {
assertTrue(movieServiceUrl.contains("localhost"), "Acual: " + movieServiceUrl);
}
会抛出:
java.lang.NullPointerException
at com.geborskimateusz.microservices.composite.movie.services.MovieCompositeIntegrationTest.getUrl(MovieCompositeIntegrationTest.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:515)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:105)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
我怎样才能实现这样的构造函数初始化?
解决方案
推荐阅读
- python-3.x - 选择每个特定数量的列的行,其中值为负数,并在 python3 的另一列中转换值 0
- vue.js - 使用 VUEJS3.0 处理大图像
- javascript - 调试 npm ERR!代码 ELIFECYCLE npm 错误!错误号 1
- groovy - 为 Groovy 中的自定义属性添加 1 天
- reactjs - React 中的嵌套条件语句:如果大于零,如何减少项目计数?
- python - 在气流容器内运行 DAG 工作正常,但从 Web 触发时会得到 AirflowException("Bash command failed")
- python - 列表内的列表与列表内的其他列表的连接
- android - 使用手电筒作为手电筒拍照-textureview android
- python - 如何使用 Graph 和 Python 访问 Outlook 联系人?
- flutter - CupertinoTextField 与表单小部件