首页 > 解决方案 > 使用 MockMvc 对控制器进行单元测试时如何捕获 logger.error 消息?

问题描述

我有一个Spring Boot应用程序,我需要验证无论何时请求失败(不同于200)系统都会记录状态代码和消息。到目前为止,我找不到验证的方法logger。有什么办法Mockito吗?

MyControllerTest代码:

@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代码:

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

我进行了研究,其中一种可能的解决方案是通过Spy或通过将修饰符更改为public. 这两种解决方案都不适用于我当前的配置。

还有什么我想念的东西可以帮助我验证logger内容,或者至少,如果logger被调用?

标签: javaspring-bootunit-testingloggingmockito

解决方案


推荐阅读