MockRestServiceServer returns 404 状态而不是模拟外部服务响应
MockRestServiceServer returns 404 status instead of mocking external service response
我正在编写一个基于 HttpRequestExecutingMessageHandler
的出站服务激活器,它向第三方 REST API 发送 POST
请求并获得 JSON 作为响应。第 3 方 REST API 接受 JSON 对象作为有效载荷。相关测试方法如下:
@BeforeEach
public void setUp() {
server = MockRestServiceServer.createServer(restTemplateBuilder.additionalMessageConverters(
httpMessageConverter).build());
messagingTemplate = new MessagingTemplate();
defaultDestination = new QueueChannel(1);
}
和
@Test
void testOutboutSMSRequestHanlder() throws Exception {
SMSTaskRequest request = new SMSTaskRequest("1",
Arrays.asList(new SMSTask(1, "123456", "Test Message")));
SMSTaskResponse response = new SMSTaskResponse("200", "OK", "task-status",
Arrays.asList(new SMSTaskStatus("1", "0 OK")));
server.expect(requestTo("http://localhost/foo/bar"))
.andRespond(withSuccess(objectMapper.writeValueAsString(response), APPLICATION_JSON));
messagingTemplate.send(outboundSMSRequestChannel,
MessageBuilder.withPayload(request)
.setHeader(CONTENT_TYPE, APPLICATION_JSON_VALUE).setReplyChannel(defaultDestination).build());
SMSTaskResponse smsTaskResponse = messagingTemplate
.receiveAndConvert(defaultDestination, SMSTaskResponse.class);
assertThat(smsTaskResponse).isEqualTo(response);
}
即使按如下方式配置我的网关后,我仍然收到外部服务请求的 404 错误
@Component
public class OutboundSMSHandlerGateway {
@Autowired
private MappingJackson2HttpMessageConverter httpMessageConverter;
@Bean
public PublishSubscribeChannel outboundSMSRequestChannel() {
return new PublishSubscribeChannel();
}
@ServiceActivator(inputChannel = "outboundSMSRequestChannel")
@Bean
public HttpRequestExecutingMessageHandler handleGatewaySMSRequest() {
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://localhost/foo/bar");
handler.setHttpMethod(POST);
handler.setExpectReply(true);
handler.setMessageConverters(Arrays.asList(httpMessageConverter));
handler.setExpectedResponseType(SMSTaskResponse.class);
return handler;
}
}
错误堆栈跟踪如下
org.springframework.messaging.MessageHandlingException: HTTP request execution failed for URI [http://localhost/foo/bar] in the [bean 'handleGatewaySMSRequest'; defined in: 'class path resource [com/thoughtscape/sms/OutboundSMSHandlerGateway.class]'; from source: 'org.springframework.core.type.classreading.SimpleMethodMetadata@19f9d595']; nested exception is org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found: [<html>
<head>
<title>Valet - Not Found</title>
<style>
body {
font-family: monospace;
}
</style>
</head>
<body>
404 - Not Found
</body>
</html>
]
, failedMessage=GenericMessage [payload=SMSTaskRequest(type=send-sms, taskNum=1, smsTasks=[SMSTask(taskID=1, recipient=123456, messageContent=Test Message, flashSms=null, characterCodingSet=null, smsCodec=null, successReport=null, failureReport=null, enableSmsReport=null)]), headers={replyChannel=org.springframework.integration.channel.QueueChannel@38f502fc, id=43ed8efa-7aea-34bd-6884-1938ed65e9d3, Content-Type=application/json, timestamp=1602675489316}]
at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:210)
at org.springframework.integration.http.outbound.AbstractHttpRequestExecutingMessageHandler.handleRequestMessage(AbstractHttpRequestExecutingMessageHandler.java:320)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:134)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:62)
at org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler(BroadcastingDispatcher.java:224)
at org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch(BroadcastingDispatcher.java:180)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:72)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:570)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:520)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
at com.thoughtscape.sms.SmsServiceApplicationTests.testOutboutSMSRequestHanlder(SmsServiceApplicationTests.java:87)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod[=14=](ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke[=14=](ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:212)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
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:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found: [<html>
<head>
<title>Valet - Not Found</title>
<style>
body {
font-family: monospace;
}
</style>
</head>
<body>
404 - Not Found
</body>
</html>
]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:113)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:184)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:125)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:695)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:593)
at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:196)
... 76 more
MockRestServiceServer returns 404 status instead of mocking external service response
不要迷惑自己:完全没有与您的模拟服务器进行交互。您只需执行一个真正的 HTTP 调用。
让我们来分析你的代码!
server = MockRestServiceServer.createServer(restTemplateBuilder.additionalMessageConverters(
httpMessageConverter).build());
因此,您尝试模拟 restTemplateBuilder
的一些结果,您在这里完成了:没有任何对服务器的引用,也没有对 RestTemplate
!
I get a 404 error for the external service request even after configuring my gateway as follows
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://localhost/foo/bar");
handler.setHttpMethod(POST);
handler.setExpectReply(true);
handler.setMessageConverters(Arrays.asList(httpMessageConverter));
handler.setExpectedResponseType(SMSTaskResponse.class);
return handler;
还有什么?与模拟服务器的交互在哪里?
请参阅有关此事的文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/testing.html#spring-mvc-test-client
非常重要的一句话:
// Test code that uses the above RestTemplate ...
因此,要使其正常工作,您需要将 RestTemplate
bean 注入到 HttpRequestExecutingMessageHandler
中。并且必须从 MockRestServiceServer.createServer()
使用相同的 RestTemplate
实例。只有这样,您的 HTTP 出站网关才能与模拟的 RestTemplate
交互,后者将从提到的模拟服务器中提取答案。
否则,HttpRequestExecutingMessageHandler
会创建自己的内部 RestTemplate
,它对模拟一无所知,并将对上述 URL.
执行真正的请求
我正在编写一个基于 HttpRequestExecutingMessageHandler
的出站服务激活器,它向第三方 REST API 发送 POST
请求并获得 JSON 作为响应。第 3 方 REST API 接受 JSON 对象作为有效载荷。相关测试方法如下:
@BeforeEach
public void setUp() {
server = MockRestServiceServer.createServer(restTemplateBuilder.additionalMessageConverters(
httpMessageConverter).build());
messagingTemplate = new MessagingTemplate();
defaultDestination = new QueueChannel(1);
}
和
@Test
void testOutboutSMSRequestHanlder() throws Exception {
SMSTaskRequest request = new SMSTaskRequest("1",
Arrays.asList(new SMSTask(1, "123456", "Test Message")));
SMSTaskResponse response = new SMSTaskResponse("200", "OK", "task-status",
Arrays.asList(new SMSTaskStatus("1", "0 OK")));
server.expect(requestTo("http://localhost/foo/bar"))
.andRespond(withSuccess(objectMapper.writeValueAsString(response), APPLICATION_JSON));
messagingTemplate.send(outboundSMSRequestChannel,
MessageBuilder.withPayload(request)
.setHeader(CONTENT_TYPE, APPLICATION_JSON_VALUE).setReplyChannel(defaultDestination).build());
SMSTaskResponse smsTaskResponse = messagingTemplate
.receiveAndConvert(defaultDestination, SMSTaskResponse.class);
assertThat(smsTaskResponse).isEqualTo(response);
}
即使按如下方式配置我的网关后,我仍然收到外部服务请求的 404 错误
@Component
public class OutboundSMSHandlerGateway {
@Autowired
private MappingJackson2HttpMessageConverter httpMessageConverter;
@Bean
public PublishSubscribeChannel outboundSMSRequestChannel() {
return new PublishSubscribeChannel();
}
@ServiceActivator(inputChannel = "outboundSMSRequestChannel")
@Bean
public HttpRequestExecutingMessageHandler handleGatewaySMSRequest() {
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://localhost/foo/bar");
handler.setHttpMethod(POST);
handler.setExpectReply(true);
handler.setMessageConverters(Arrays.asList(httpMessageConverter));
handler.setExpectedResponseType(SMSTaskResponse.class);
return handler;
}
}
错误堆栈跟踪如下
org.springframework.messaging.MessageHandlingException: HTTP request execution failed for URI [http://localhost/foo/bar] in the [bean 'handleGatewaySMSRequest'; defined in: 'class path resource [com/thoughtscape/sms/OutboundSMSHandlerGateway.class]'; from source: 'org.springframework.core.type.classreading.SimpleMethodMetadata@19f9d595']; nested exception is org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found: [<html>
<head>
<title>Valet - Not Found</title>
<style>
body {
font-family: monospace;
}
</style>
</head>
<body>
404 - Not Found
</body>
</html>
]
, failedMessage=GenericMessage [payload=SMSTaskRequest(type=send-sms, taskNum=1, smsTasks=[SMSTask(taskID=1, recipient=123456, messageContent=Test Message, flashSms=null, characterCodingSet=null, smsCodec=null, successReport=null, failureReport=null, enableSmsReport=null)]), headers={replyChannel=org.springframework.integration.channel.QueueChannel@38f502fc, id=43ed8efa-7aea-34bd-6884-1938ed65e9d3, Content-Type=application/json, timestamp=1602675489316}]
at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:210)
at org.springframework.integration.http.outbound.AbstractHttpRequestExecutingMessageHandler.handleRequestMessage(AbstractHttpRequestExecutingMessageHandler.java:320)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:134)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:62)
at org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler(BroadcastingDispatcher.java:224)
at org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch(BroadcastingDispatcher.java:180)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:72)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:570)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:520)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
at com.thoughtscape.sms.SmsServiceApplicationTests.testOutboutSMSRequestHanlder(SmsServiceApplicationTests.java:87)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod[=14=](ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke[=14=](ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:212)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
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:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found: [<html>
<head>
<title>Valet - Not Found</title>
<style>
body {
font-family: monospace;
}
</style>
</head>
<body>
404 - Not Found
</body>
</html>
]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:113)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:184)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:125)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:695)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:593)
at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:196)
... 76 more
MockRestServiceServer returns 404 status instead of mocking external service response
不要迷惑自己:完全没有与您的模拟服务器进行交互。您只需执行一个真正的 HTTP 调用。
让我们来分析你的代码!
server = MockRestServiceServer.createServer(restTemplateBuilder.additionalMessageConverters(
httpMessageConverter).build());
因此,您尝试模拟 restTemplateBuilder
的一些结果,您在这里完成了:没有任何对服务器的引用,也没有对 RestTemplate
!
I get a 404 error for the external service request even after configuring my gateway as follows
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://localhost/foo/bar");
handler.setHttpMethod(POST);
handler.setExpectReply(true);
handler.setMessageConverters(Arrays.asList(httpMessageConverter));
handler.setExpectedResponseType(SMSTaskResponse.class);
return handler;
还有什么?与模拟服务器的交互在哪里? 请参阅有关此事的文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/testing.html#spring-mvc-test-client
非常重要的一句话:
// Test code that uses the above RestTemplate ...
因此,要使其正常工作,您需要将 RestTemplate
bean 注入到 HttpRequestExecutingMessageHandler
中。并且必须从 MockRestServiceServer.createServer()
使用相同的 RestTemplate
实例。只有这样,您的 HTTP 出站网关才能与模拟的 RestTemplate
交互,后者将从提到的模拟服务器中提取答案。
否则,HttpRequestExecutingMessageHandler
会创建自己的内部 RestTemplate
,它对模拟一无所知,并将对上述 URL.