Spring Boot控制器测试 - 断言静态HTML响应

时间:2018-01-26 12:12:42

标签: java spring-boot spring-boot-test

我正在尝试编写单元测试来验证请求是否返回静态html文件的内容。运行服务器时会呈现页面,但测试响应中没有内容。

控制器类:

@Controller
public class IndexController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index() {
        return "index.html";
    }
}

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class IndexControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldReturnIndexPage() throws Exception {
        File index = new ClassPathResource("static/index.html").getFile();
        String html = new Scanner(index).useDelimiter("\\z").next();

        mockMvc.perform(get("/"))
                .andExpect(status().isOk())
                .andExpect(view().name("index.html"))
                .andExpect(content().string(html));
    }
}

我错过了什么?

编辑:

我有一个工作测试,涉及实际启动服务器。然而,我的目标是不必使用@WebMvcTest来做到这一点。不确定这是否可能。我认为这是一种解决方法(除非它是唯一的方法),我仍在寻找解决方案(不需要启动服务器)。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class IndexControllerTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void shouldReturnIndexPage() throws Exception {
        File index = new ClassPathResource("static/index.html").getFile();
        String html = new Scanner(index).useDelimiter("\\z").next();

        String responseBody = restTemplate.getForObject("/", String.class);

        assertThat(responseBody).isEqualTo(html);
    }
}

1 个答案:

答案 0 :(得分:1)

我遇到了同样问题的问题,我设法使用 MockMvc 来构建测试

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class homePageControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testIndex() throws Exception{
        File login = new ClassPathResource("static/login.html").getFile();
        String html = new String(Files.readAllBytes(login.toPath()));

        this.mockMvc.perform(get("/login.html"))
                .andExpect(status().isOk())
                .andExpect(content().string(html))
                .andDo(print());
    }
}

通过执行http请求进行测试时,您必须生成整个服务器,因此他可以处理请求,即标题,状态等

希望有所帮助