zoukankan      html  css  js  c++  java
  • spring boot单元测试之十四:controller使用html模板时做单元测试(spring boot 2.4.4)

    一,演示项目的相关信息

    1,地址:

    https://github.com/liuhongdi/modelviewtest

    2,功能说明:演示controller使用thymeleaf模板而不是返回json时的单元测试

    3,项目结构:如图:

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/

    说明:作者:刘宏缔 邮箱: 371125307@qq.com

    二,配置文件说明

    1,pom.xml:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--thymeleaf begin-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <!--thymeleaf   end-->
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>

    2,application.yml

    #error
    server:
      error:
        include-stacktrace: always
    #errorlog
    logging:
      level:
        org:
          springframework:
            web: trace
    #thymeleaf
    spring:
      thymeleaf:
        cache: false
        encoding: UTF-8
        mode: HTML
        prefix: classpath:/templates/
        suffix: .html

    三,java代码说明

    1,controller/HomeController.java

    @Controller
    @RequestMapping("/home")
    public class HomeController {
    
        //返回单个商品
        @GetMapping("/one")
        public String one(Model model) {
            Goods goods31 = new Goods();
            goods31.setGoodsId(31L);
            goods31.setGoodsName("纯色真丝睡袍");
    
            //把list传递给模板
            model.addAttribute("goodsOne",goods31);
            return "home/one.html";
        }
    
        //返回商品列表
        @GetMapping("/list")
        public String list(Model model) {
    
            ArrayList<Goods> listGoods1 = new ArrayList<Goods>();
    
            Goods goods1 = new Goods();
            goods1.setGoodsId(1L);
            goods1.setGoodsName("无线智能感应灯");
            listGoods1.add(goods1);
            Goods goods2 = new Goods();
            goods2.setGoodsId(2L);
            goods2.setGoodsName("朱之光落地灯");
            listGoods1.add(goods2);
            Goods goods3 = new Goods();
            goods3.setGoodsId(3L);
            goods3.setGoodsName("儿童抗首菌枕头");
            listGoods1.add(goods3);
            //把list传递给模板
            model.addAttribute("list",listGoods1);
            return "home/list.html";
        }
    }

    2,pojo/Goods.java

    //商品模型
    public class Goods {
        //商品id
        Long goodsId;
        public Long getGoodsId() {
            return this.goodsId;
        }
        public void setGoodsId(Long goodsId) {
            this.goodsId = goodsId;
        }
    
        //商品名称
        private String goodsName;
        public String getGoodsName() {
            return this.goodsName;
        }
        public void setGoodsName(String goodsName) {
            this.goodsName = goodsName;
        }
    
        //商品标题
        private String subject;
        public String getSubject() {
            return this.subject;
        }
        public void setSubject(String subject) {
            this.subject = subject;
        }
    
        //商品价格
        private BigDecimal price;
        public BigDecimal getPrice() {
            return this.price;
        }
        public void setPrice(BigDecimal price) {
            this.price = price;
        }
    
        //库存
        int stock;
        public int getStock() {
            return this.stock;
        }
        public void setStock(int stock) {
            this.stock = stock;
        }
    
        //打印
        @Override
        public String toString(){
            return " Goods:goodsId=" + goodsId +" goodsName=" + goodsName+" subject=" + subject+" price=" + price+" stock=" + stock;
        }
    }

    3,controller/HomeControllerTest.java

    @AutoConfigureMockMvc
    @SpringBootTest
    class HomeControllerTest {
        @Autowired
        private MockMvc mockMvc;
    
        @Test
        @DisplayName("测试显示单个商品")
        void one() throws Exception {
            ModelAndView mv=mockMvc.perform(get("/home/one"))
                    .andExpect(status().isOk())
                    .andReturn().getModelAndView();
            //view
            String viewName=mv.getViewName();
            assertThat(viewName,equalTo("home/one.html"));
            //model
            Goods goods = (Goods)mv.getModel().get("goodsOne");
            assertThat(goods.getGoodsId(),equalTo(31L));
            assertThat(goods.getGoodsName(),equalTo("纯色真丝睡袍"));
    
        }
    
        @Test
        @DisplayName("测试显示商品列表")
        void list() throws Exception {
            ModelAndView mv=mockMvc.perform(get("/home/list"))
                    .andExpect(status().isOk())
                    .andReturn().getModelAndView();
            //view
            String viewName=mv.getViewName();
            assertThat(viewName,equalTo("home/list.html"));
    
    
            Map<String, Object> model = mv.getModel();
            ArrayList<Goods> list = (ArrayList) model.get("list");
            //检查列表数量
            assertThat(list.size(),greaterThan(0));
            //检查第一个商品的id
            Goods one = list.get(0);
            assertThat(one.getGoodsId(),greaterThan(0L));
        }
    }

    4,templates/home/one.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    </head>
    <body>
    <div style="100%;height:30px;background:#ffffff;font-size: 16px;" ></div>
    <div id="content" style="1040px;">
        <div style="790px;float:left;margin-left:30px;">
            <!--main begin-->
                <!--显示分类下的商品列表信息-->
                <div style="790px;height:100px;">
                    <div style="250px;height:100px;float: left;background:#eeeeee;margin-left:10px;margin-top:10px;">
                        <div>商品ID:[[${goodsOne.goodsId}]]</div>
                        <div>商品名称:[[${goodsOne.goodsName}]]</div>
                    </div>
                </div>
            <!--main   end-->
        </div>
    </div>
    </body>
    </html>

    5,templates/home/list.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    </head>
    <body>
    <div style="100%;height:30px;background:#ffffff;font-size: 16px;" ></div>
    <div id="content" style="1040px;">
        <div style="790px;float:left;margin-left:30px;">
            <!--main begin-->
            <div style="790px;height:100px;">
                <div th:each="goodsOne:${list}" style="250px;height:100px;float: left;background:#eeeeee;margin-left:10px;margin-top:10px;">
                    <div>商品ID:[[${goodsOne.goodsId}]]</div>
                    <div>商品名称:[[${goodsOne.goodsName}]]</div>
                </div>
            </div>
            <!--main   end-->
        </div>
    </div>
    </body>
    </html>

    四,测试效果

    1,访问url:

    http://127.0.0.1:8080/home/one

    返回:

    访问:

    http://127.0.0.1:8080/home/list

    返回:

    2,运行单元测试:

    五,查看spring boot的版本:

      .   ____          _            __ _ _
     /\ / ___'_ __ _ _(_)_ __  __ _    
    ( ( )\___ | '_ | '_| | '_ / _` |    
     \/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.4.4)
  • 相关阅读:
    JSP版LCX:端口转发神器 KPortTran
    使用 JavaScript 实现对 PDF 的全文索引
    伙伴分配器的一个极简实现
    java创建线程的三种方式及其对照
    【版本号公布】Jeecg-P3 1.0 公布,J2EE微服务框架(插件开发)
    linux c 获取当前执行进程总数
    C++入门学习——模板
    GSON学习笔记之初识GSON
    Python学习笔记_Python对象
    怎样在OTN站点高速找到asm包并下载 (Oracle RAC)
  • 原文地址:https://www.cnblogs.com/architectforest/p/14610975.html
Copyright © 2011-2022 走看看