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

时间:2017-10-09 20:31:36

标签: java spring-mvc junit spring-boot-actuator mockmvc

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

1 个答案:

答案 0 :(得分: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());
    }
}