Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I test a custom Spring Boot Actuator endpoint?

I have a spring boot actuator and WebMvc test isn't working. It returns an empty body. How would I test this?

@Configuration
@ManagementContextConfiguration
public class TestController extends AbstractMvcEndpoint
{
    public TestController()
    {
        super( "/test", false, true );
    }

    @GetMapping( value = "/get", produces = MediaType.APPLICATION_JSON_VALUE )
    @ResponseBody
    public OkResponse getInfo() throws Exception
    {
        return new OkResponse( 200, "ok" );
    }

    @JsonPropertyOrder( { "status", "message" } )
    public static class OkResponse
    {
        @JsonProperty
        private Integer status;

        @JsonProperty
        private String message;

        public OkResponse(Integer status, String message)
        {
            this.status = status;
            this.message = message;
        }

        public Integer getStatus()
        {
            return status;
        }

        public String getMessage()
        {
            return message;
        }
    }
}

When I try to test it with the below, it doesn't work. I get an empty body in the return.

@RunWith( SpringJUnit4ClassRunner.class )
@DirtiesContext
@WebMvcTest( secure = false, controllers = TestController.class)
@ContextConfiguration(classes = {TestController.class})
public class TestTestController
{
    private MockMvc mockMvc;

    private ObjectMapper mapper;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setup()
    {
        //Create an environment for it
        mockMvc = MockMvcBuilders.webAppContextSetup( this.webApplicationContext )
                .dispatchOptions( true ).build();
        mapper = new ObjectMapper();
    }

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

    @Test
    public void test() throws Exception
    {
        //Get the controller's "ok" message
        String response = mockMvc.perform(
            get("/test/get")
        ).andReturn().getResponse().getContentAsString();

        //Should be not null
        Assert.assertThat( response, Matchers.notNullValue() );

        //Should be equal
        Assert.assertThat( 
            response,
            Matchers.is( 
                Matchers.equalTo( 
                    "{\"status\":200,\"message\":\"ok\"}"
                )
            )
        );
    }
}
like image 986
Don Rhummy Avatar asked Nov 07 '22 11:11

Don Rhummy


1 Answers

Here's a test I wrote to do something like what you are talking about. This test validates that our only the actuator endpoints we want to expose are available.

This is using SpringBoot 1.5.

I found the question here helpful: Unit testing of Spring Boot Actuator endpoints not working when specifying a port.

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = {
        "management.port="
})
public class ActuatorTests {

    @Autowired
    private WebApplicationContext context;

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    private MockMvc mvc;


    @Before
    public void setup() {
        context.getBean(MetricsEndpoint.class).setEnabled(true);

        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .alwaysDo(print())
                .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
                .build();
    }


    @Test
    public void testHealth() throws Exception {
        MvcResult result = mvc.perform(get("/health")
                .with(anonymous()))
                .andExpect(status().is2xxSuccessful())
                .andReturn();

        assertEquals(200, result.getResponse().getStatus());
    }

    @Test
    public void testRestart() throws Exception {
        MvcResult result = mvc.perform(get("/restart")
                .with(anonymous()))
                .andExpect(status().is3xxRedirection())
                .andReturn();

        assertEquals(302, result.getResponse().getStatus());
        assertEquals("/sso/login", result.getResponse().getRedirectedUrl());
    }
}
like image 192
Tony Zampogna Avatar answered Nov 15 '22 05:11

Tony Zampogna