指定端口时,Spring Boot Actuator端点的单元测试无效

时间:2016-07-21 13:20:45

标签: junit spring-boot spring-boot-actuator

最近我改变了我的spring boot属性来定义一个管理端口。 这样做,我的单元测试开始失败:(

我编写了一个测试 / metrics 端点的单元测试,如下所示:

@RunWith (SpringRunner.class)
@DirtiesContext
@SpringBootTest
public class MetricsTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    /**
     * Called before each test.
     */
    @Before
    public void setUp() {
        this.context.getBean(MetricsEndpoint.class).setEnabled(true);
        this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
    }

    /**
     * Test for home page.
     *
     * @throws Exception On failure.
     */
    @Test
    public void home()
            throws Exception {
        this.mvc.perform(MockMvcRequestBuilders.get("/metrics"))
                .andExpect(MockMvcResultMatchers.status().isOk());
    }
}        

此前这已经过去了。添加后:

management.port=9001

测试开始失败:

home Failed: java.lang.AssertionError: Status expected: <200> but was: <404>

我尝试使用以下命令更改@SpringBootTest注释:

@SpringBootTest (properties = {"management.port=<server.port>"})

server.port使用的号码在哪里。这似乎没有任何区别。

然后将属性文件中的management.port值更改为与server.port相同。结果相同。

让测试工作的唯一方法是从属性文件中删除management.port。

有任何建议/想法吗?

由于

7 个答案:

答案 0 :(得分:2)

您是否尝试将以下注释添加到测试类中?

@TestPropertySource(properties = {"management.port=0"})

Check the following link for reference

答案 1 :(得分:1)

如果出现同样的问题,你只需要在application-test.properties中添加它来使management.port为null(将其设置为空值)

management.port=

确保通过使用

注释类来在JUnit中使用测试配置文件
@ActiveProfiles("test")

答案 2 :(得分:1)

属性名称是否没有错误? 不应该 @TestPropertySource(properties = {"management.server.port=..."})代替@TestPropertySource(properties = {"management.port=.."})

答案 3 :(得分:0)

对于Spring启动测试,我们需要指定连接所需的端口。

默认情况下,它连接到server.port,如果执行器不同。

这可以通过

完成
@SpringBootTest(properties = "server.port=8090")

application.properties中我们指定管理端口如下

...
management.port=8090
...

答案 4 :(得分:0)

对于Spring Boot 2.x,可以简化集成测试配置。

例如简单的自定义heartbeat端点

@Component
@Endpoint(id = "heartbeat")
public class HeartbeatEndpoint {

    @ReadOperation
    public String heartbeat() {
        return "";
    }
}

此端点的集成测试在哪里

@SpringBootTest(
        classes = HeartbeatEndpointTest.Config.class,
        properties = {
                "management.endpoint.heartbeat.enabled=true",
                "management.endpoints.web.exposure.include=heartbeat"
        })
@AutoConfigureMockMvc
@EnableAutoConfiguration
class HeartbeatEndpointTest {

    private static final String ENDPOINT_PATH = "/actuator/heartbeat";

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testHeartbeat() throws Exception {
        mockMvc
                .perform(get(ENDPOINT_PATH))
                .andExpect(status().isOk())
                .andExpect(content().string(""));
    }

    @Configuration
    @Import(ProcessorTestConfig.class)
    static class Config {

        @Bean
        public HeartbeatEndpoint heartbeatEndpoint() {
            return new HeartbeatEndpoint();
        }

    }

}    

答案 5 :(得分:0)

我遇到了同样的问题并尝试了几种方法,但这就是我能够在不更改 application.yaml

的情况下解决我的问题的方法

执行器端点示例

@Component
@RestControllerEndpoint(id = "endpoint")
public class SampleEndpoint
{
    @GetMapping
    public String sampleEndpoint(){
      return ""
    }
}

单元测试用例

@RunWith(SpringRunner.class)
@SpringBootTest(
    classes = {SampleEndpointTest.Config.class},
    properties = {"management.server.port="}
)
@AutoConfigureMockMvc
public class SampleEndpointTest
{
    @Autowired
    private MockMvc mockMvc;

    @SpringBootApplication(scanBasePackageClasses = {SampleEndpoint.class})
    public static class Config
    {
    }

    @Test
    public void testSampleEndpoint() throws Exception
    {

        mockMvc.perform(
            MockMvcRequestBuilders.get("/actuator/enpoint").accept(APPLICATION_JSON)
        ).andExpect(status().isOk());
    }

答案 6 :(得分:-1)

尝试使用

@SpringBootTest(properties = {"management.port="})

@SpringBootTest注释中定义的属性比应用程序属性中的属性higher precedence"management.port="将“取消设置”management.port属性 这样您就不必担心在测试中配置端口了。