1.3.3 测试控制器

在对 HTML 页面的内容进行断言时,测试 web 应用程序可能比较棘手。幸运的是,Spring 提供了一些强大的测试支持,使测试 web 应用程序变得很容易。

就主页而言,您将编写一个与主页本身复杂度相当的测试。您的测试将对根路径 / 执行一个 HTTP GET 请求并期望得到一个成功的结果,其中视图名称为 home,结果内容包含短语 “Welcome to…”。下面的程序清单应该可以达到目的。

程序清单 1.6 主页控制器测试

package tacos;import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;@WebMvcTest(HomeController.class)
public class HomeControllerTest {

  @Autowired
  private MockMvc mockMvc;

  @Test
  public void testHomePage() throws Exception {
    mockMvc.perform(get("/"))
      .andExpect(status().isOk())
      .andExpect(view().name("home"))
      .andExpect(content().string(
          containsString("Welcome to...")));
  }
}

关于这个测试,您可能注意到的第一件事是,它与 TacoCloudApplicationTests 类在应用到它的注释方面略有不同。HomeControllerTest 使用 @WebMvcTest 注释,而不是 @SpringBootTest 标记。这是 Spring Boot 提供的一个特殊测试注释,它安排测试在 Spring MVC 应用程序的上下文中运行。更具体地说,在本例中,它安排 HomeController 在 Spring MVC 中注册,这样您就可以对它进行请求。

@WebMvcTest 还为测试 Spring MVC 提供了 Spring 支持。虽然可以让它启动服务器,但模拟 Spring MVC 的机制就足以满足您的目的了。测试类被注入了一个 MockMvc 对象中,以此用来测试来驱动模型。

testHomePage() 方法定义了要对主页执行的测试。它从 MockMvc 对象开始,执行针对 /(根路径)的 HTTP GET 请求。该请求规定了下列期望值:

  • 响应应该有一个HTTP 200(OK)状态。
  • 视图应该有一个逻辑名称,home。
  • 呈现的视图应该包含 “Welcome to...”

您可以在您选择的 IDE 中或使用 Maven 运行测试,如下所示:

$ mvnw test

如果在 MockMvc 对象执行请求之后,这些期望中的任何一个都没有满足,那么测试就会失败。但是控制器和视图模板是为了满足这些期望而编写的,所以测试应该能够通过,或者至少能够通过一些表示测试通过的绿色提示。

控制器写好了,视图模板创建好了,测试通过了。看来您已经成功地实现了主页。但是,即使测试通过了,在浏览器中查看结果也会稍微让人更满意一些。毕竟,Taco Cloud 的客户也将这样看待它。让我们构建应用程序并运行它。

results matching ""

    No results matching ""