java - 设置管理端口时Spring Boot的执行器不可用

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

最佳答案

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());
    }
}

关于java - 设置管理端口时Spring Boot的执行器不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46654505/

相关文章:

java - 从脚本文件调用 jar 文件内的函数

java - ClassLoader.getSystemClassLoader().getResource() 在 servlet 容器和测试环境中的不同行为

java - 模拟对象并将它们分配给方法中的实例变量和静态变量

java - Hibernate 与子类复合列的一对一映射

java - 比较可能以不同内部顺序出现的字符串

java - 如何在 Kotlin 的公共(public)池下创建单线程协程上下文?

java - 名称为 "nashorn"的 ScriptEngine 为空

java - 组合来自 2 个数组的唯一整数的最快方法

java - 如何在自定义登录页面获取注销消息

java - 如何在不使用 Session 的情况下在 Spring 中将对象从一个 Controller 传递到另一个 Controller