【发布时间】:2022-02-03 07:08:05
【问题描述】:
我的应用程序在本地运行,端口为 8089,我正在尝试进行 Spring Rest Controller 测试。
它运行在 8089 端口。
在 application.yml 中
spring:
profiles:
active: sit
在 application-sit.yml 中
server:
port: 8089
servlet:
context-path: /myapp
在我的基本测试用例中:
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SpringJUnit4ClassRunner.class)
//@SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
//@WebAppConfiguration
@SpringBootTest(classes = MyApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("sit")
public abstract class FullOtpControllerTest {
protected MockMvc mvc;
@Autowired
WebApplicationContext webApplicationContext;
@Value("${server.port}")
int serverPort;
@Test
public void sendOtpTest() throws Exception {
String uri = "/sendOtp";
//{"clientId": "default2","tag": "tag","mobileNumber": "9999988888"}
SendOTPRequestDTO otpRequest = new SendOTPRequestDTO();
otpRequest.setClientId("default2");
otpRequest.setTag("tag");
otpRequest.setMobileNumber("9321901416");
String inputJson = mapToJson(otpRequest);
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
//.accept(MediaType.APPLICATION_JSON_VALUE)).andReturn()
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(inputJson)).andReturn();
int status = mvcResult.getResponse().getStatus();
String content = mvcResult.getResponse().getContentAsString();
assertEquals(8089,serverPort);
assertEquals(200, status);
}
}
但是,第一个断言通过了。但在调试中它显示了不同的端口,如下图所示。
我运行:OtpControllerTest.sendOtpTest,我得到:
java.lang.AssertionError:
Expected :200
Actual :404
【问题讨论】:
-
不能使用 MockMvc 连接真实服务器。这就是
TestRestTemplate和TestWebClient的用途。 -
请帮助我了解更多详情。
-
@SpringBootTest 上的这篇文章可能会有所帮助。使用
MockMvc,您可以针对模拟的servlet 环境进行测试(通常在@WebMvcTest内完成)。在您的测试中,当您在本地端口上启动嵌入式 servlet 容器时,您需要真正的 HTTP 通信。简而言之,删除MockMvc并注入自动配置的TestRestTemplate以访问您的本地应用程序。
标签: spring spring-boot spring-test spring-rest