如何使用@AutoConfigureMockMvc仅打印失败测试的请求?

时间:2019-05-24 14:33:39

标签: java spring spring-boot spring-mvc mockmvc

在我们的项目中,我们使用@AutoConfigureMockMvc,默认情况下保留printOnlyOnFailuretrue

这正常工作,不打印任何请求……除非任何测试失败。此时,它会打印之前执行过的 ALL 测试中的所有请求。尽管有时这可能有用,但它可能会打印大量日志,如果它在CI服务器上发生,则日志将被截断,并且我们甚至无法看到哪个测试失败了(因为之后打印了AssertionError。 / p>

更糟糕的是:如果多个测试失败,则会为每个失败的测试打印所有先前的请求。

是否可以对其进行配置,使其仅打印失败测试的请求?

以下是重现该问题的示例测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockMvcTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void successfulTest() throws Exception {
        mockMvc.perform(get("/successfulTest"))
                .andExpect(status().isNotFound());
    }

    @Test
    public void failingTest() throws Exception {
        mockMvc.perform(get("/failingTest"))
                .andExpect(status().isOk());
    }

    @Test
    public void failingTest2() throws Exception {
        mockMvc.perform(get("/failingTest2"))
                .andExpect(status().isOk());
    }

    @Configuration
    static class TestApplication {
    }
}

我们正在使用spring-boot 1.5.14和Java8。我还重现了spring-boot 2.1.4的问题。

从我发现的情况来看,日志行存储在org.springframework.boot.test.autoconfigure.web.servlet.SpringBootMockMvcBuilderCustomizer.DeferredLinesWriter.lines中,并且永远不会重置,也似乎没有办法重置它-我宁愿避免通过反射来做到这一点。 / p>

1 个答案:

答案 0 :(得分:1)

因此,我尝试将更多精力投入到SpringBootMockMvcBuilderCustomizer实现中,所有内容似乎都是privateprotected,从而阻止了重用任何内容(甚至不确定您是否可以重用{{ 1}}本身,由于唯一的构造函数是PrintingResultHandler,因此您不得不对其进行扩展。

虽然使用反射不是太难,但将其添加到测试中:

protected

不太干净,可能会在将来的Spring Boot版本中中断,但可以使用。

我希望可以实施更好的解决方案,但恐怕不可能。