我使用 Spring boot + Spring Security + Spring Actuator
我的 JUnit 测试类:
@RunWith(SpringRunner.class)
@SpringBootTest()
@AutoConfigureMockMvc
public class ActuatorTests {
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser(roles={"USER","SUPERUSER"})
public void getHealth() throws Exception {
mockMvc.perform(get("/health"))
.andExpect(status().isOk());
}
}
没问题,但是当我设置management.port: 8088
时,我的测试结果是 KO,并显示以下消息:
[ERROR] ActuatorTests.getHealth:37 Status expected:<200> but was:<404>
如何在 JUnit 测试 MockMvc 或测试配置中设置管理端口?
最佳答案
当management.port
与server.port
不同时,Spring将创建一个单独的Web应用程序上下文和一个专用的servlet容器,它将在其中注册所有执行器。默认的 MockMvc
针对主应用程序 Web 上下文而不是管理上下文路由请求。这就是您的情况所发生的情况 - 由于主应用程序 Web 上下文中没有运行执行器,因此您会得到 404。要测试在管理上下文中运行的端点,请使用以下设置:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ManagementContextMvcTest {
@Autowired
private ManagementContextResolver resolver;
private MockMvc mockMvc;
@Before
public void setUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(
(WebApplicationContext) resolver.getApplicationContext()).build();
}
@Test
@WithMockUser(roles = { "USER", "SUPERUSER" })
public void getHealth() throws Exception {
mockMvc.perform(get("/health"))
.andExpect(status().isOk());
}
}
关于java - 设置管理端口时Spring Boot的执行器不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46654505/