设置管理端口时,Spring引导的执行器不可用

问题描述 投票:1回答:1

我使用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或测试配置中设置管理端口?

java spring-mvc junit spring-boot-actuator mockmvc
1个回答
2
投票

management.portserver.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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.