How to capture logger.error messages when unit-test Controller with MockMvc?

Viewed 730

I have a Spring Boot app and I need to verify that whenever a request failed (different from 200) system logs the status code and message. So far, I cannot find a way to verify logger. Is there any way to do it with Mockito?

MyControllerTest code:

@RunWith(MockitoJUnitRunner.class)
@TestPropertySource(locations = "classpath:application-test.yml")
public class MyControllerTest {
    private MockMvc mockMvc;

    @Mock
    private RestTemplate localRestTemplate;

    @InjectMocks
    private MyController myController;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
    }

    @Test
    public void test() throws Exception {
        given(localRestTemplate.getForEntity("/test", String.class))
        .willReturn(new ResponseEntity<>("Unsupported media type", HttpStatus.UNSUPPORTED_MEDIA_TYPE));

        mockMvc.perform(get(MY_URL))
        .andExpect(status().isOk());
    }
}

MyController code:

@RestController
@RequestMapping(value = "/my/url")
public class MyController {

    protected final static Logger logger = LoggerFactory.getLogger(MyController.class);

    private final RestTemplate localRestTemplate;

    @Autowired
    public MyController(RestTemplate localRestTemplate) {
        this.localRestTemplate = localRestTemplate;
    }

    @Scheduled(cron = "-")
    @GetMapping(path="/report")
    public void getReport() {
        try {
            localRestTemplate
                    .getForEntity("/test", String.class);
        } catch (RestClientException e) {
            logger.error("Couldn't trigger report generation!", e);
        }
    }
}

I made research and one of the possible solutions would be through Spy or through changing modifiers to public. Both solutions are not applicable to my current configuration.

Is there anything else I miss that can help me verify logger content or, at least, if logger was called?

0 Answers
Related