zoukankan      html  css  js  c++  java
  • SpringBoot中使用JNnit4(入门篇)

    一、添加依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    

    二、在web项目(即含有SpringApplication启动类)中test目录新建测试类,包路径和SpringApplication中的扫描路径一致,否则无法启动测试类。

    若测试类的包路径和启动类的包路径不一致,会出现以下错误信息:

    Neither @ContextConfiguration nor @ContextHierarchy found for test class [xx.xx.Test], using SpringBootContextLoader

    Could not detect default resource locations for test class [xx.xx.Test]: no resource found for suffixes {-context.xml, Context.groovy}.

    Could not detect default configuration classes for test class [xx.xx.Test]: Test does not declare any static, non-private, non-final, nested classes annotated with @Configuration.

    三、测试类添加

    package xx.xx.test;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    @WebAppConfiguration
    public class ApplicationTests {
    
        @Before
        public void init(){
            System.out.println("******测试开始");
        }
        
        @After
        public void end(){
            System.out.println("******测试结束");
        }
        
        @BeforeClass
        public static void initClass(){
            System.out.println("******测试开始初始化");
        }
        
        @AfterClass
        public static void endClass(){
            System.out.println("******测试结束初始化");
        }
    }
    package xx.xx.test;
    
    public class Test extends ApplicationTests{
        
        @Autowired
        private BtsTradeGoodsService btsTradeGoodsService;
    
        @org.junit.Test
        public void add(){
            btsTradeGoodsService.add();
        }
        
    }

    然后在有@Test注解方法的类中使用JUint启动。

    在@Test注解的方法中,和平时开发项目调用接口是一样的。

    四、注解

    1、类注解

    @RunWith:

      1.表示运行方式,@RunWith(JUnit4TestRunner)、@RunWith(SpringRunner.class)、@RunWith(PowerMockRunner.class) 三种运行方式,分别在不同的场景中使用。

      1.当一个类用@RunWith注释或继承一个用@RunWith注释的类时,JUnit将调用它所引用的类来运行该类中的测试而不是开发者去在junit内部去构建它。我们在开发过程中使用这个特性。

    @SpringBootTest:

      1.注解制定了一个测试类运行了Spring Boot环境。提供了以下一些特性:

        1.1.当没有特定的ContextConfiguration#loader()(@ContextConfiguration(loader=...))被定义那么就是SpringBootContextLoader作为默认的ContextLoader。

        1.2.自动搜索到SpringBootConfiguration注解的文件。

        1.3.允许自动注入Environment类读取配置文件。

        1.4.提供一个webEnvironment环境,可以完整的允许一个web环境使用随机的端口或者自定义的端口。

        1.5.注册了TestRestTemplate类可以去做接口调用。

      2.添加这个就能取到spring中的容器的实例,如果配置了@Autowired那么就自动将对象注入。

    @WebAppConfiguration:

      由于是Web项目,Junit需要模拟ServletContext,因此我们需要给我们的测试类加上@WebAppConfiguration。

    @WebIntegrationTest("server.port:0"):

      使用0表示端口号随机,也可以具体指定如8888这样的固定端口。不可和@WebAppConfiguration同时使用。

    2、方法注解

    @BeforeClass:方法只能是static void。

    @AfterClass:方法只能是static void。

    @Before:@Test运行之前调用的方法,可以做初始化操作

    @After:执行完测试用例需要执行的清理工作

    @Test:测试用例的单元

    @Mock:

      有点类似Autowired注解,而@Mock注解是自动实现模拟对象,而并非Bean实例创建。

      正式环境只是一个接口,并没有实现,也并没有纳入spring容器进行管理。使用BDDMockito对行为进行预测。

    @Ignore("not ready yet"):该方法不执行

    执行顺序是:@BeforeClass→@Before→@Test→@After→@AfterClass

    当启动测试类,测试类中有多个@Test,@BeforeClass和@AfterClass只会执行一次,每一个@Test都会执行一次@Before和@After。

    五、对Controller进行测试

      1、使用浏览器直接访问:

        http://localhost:8080/index     

        http://localhost:8080/show?id=100

      2、使用测试类:

    package xx.xx.ctrl;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserCtrl {
    
        @GetMapping("/index")
        public String index(){
            System.out.println("UserCtrl.index");
            return "UserCtrl.index";
        }
        
        @GetMapping("/show")
        public String show(@RequestParam("id")String id){
            System.out.println("UserCtrl.show:" + id);
            return "UserCtrl.show:" + id;
        }
    }
    package xx.xx.test;
    
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    public class ApplicationTests {
    
        @Before
        public void init(){
            System.out.println("******测试开始");
        }
        
        @After
        public void end(){
            System.out.println("******测试结束");
        }
        
        @BeforeClass
        public static void initClass(){
            System.out.println("******测试开始初始化");
        }
        
        @AfterClass
        public static void endClass(){
            System.out.println("******测试结束初始化");
        }
    }
    package xx.xx.test;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.web.client.TestRestTemplate;
    
    
    public class Test extends ApplicationTests{
        
        @Autowired
        private TestRestTemplate testRestTemplate;
    
        @org.junit.Test
        public void toIndex(){
            String t = testRestTemplate.getForObject("/index", String.class);
            System.out.println("toIndex:" + t);
        }
        
        @org.junit.Test
        public void toShow(){
            String t = testRestTemplate.getForObject("/show?id=99", String.class);
            System.out.println("toShow:" + t);
        }
        
        
        @Override
        public void init(){
            System.out.println("******重写测试开始");
        }
    }

     使用这种方式,在@SpringBootTest注解中一定要添加webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT

  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/guochang/p/10430128.html
Copyright © 2011-2022 走看看