Spring Boot 单元测试

0.192字数 301阅读 112

Spring Boot 提供了一些实用程序和注解,用来帮我们测试应用程序。测试由两个模块支持——spring-boot-test包含了核心项目,而spring-boot-test-autoconfigure支持自动配置测试。

使用

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

例子

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootApplicationTests {

    @Autowired
    DeviceService deviceService; //要测试的service

    @BeforeClass
    public static void classBefore() {
        System.out.println("在每个类加载之前执行");
    }

    @AfterClass
    public static void classAfter() {
        System.out.println("在每个类加载之后执行");
    }

    @Before
    public void before() {
        System.out.println("在每个测试方法之前执行");
    }

    @After
    public void after() {
        System.out.println("在每个测试方法之后执行");
    }
   /**
     * 测试service
     */
    @Autowired
    UserService userService;
    @Test
    //事务回滚
    @Transactional
    public void updateLoginTime() {
        int i = userService.updateLoginTime(1);
        Assert.assertEquals(1, i);
    }



    private MockMvc mvc;
    private MockMvc loginMvc;

    @Before
  public void setUp() throws Exception {
        //初始化
        mvc = MockMvcBuilders.standaloneSetup(new CentralMonitorController()).build();
        loginMvc = MockMvcBuilders.standaloneSetup(new LoginController()).build();
    }

    /**
     * 测试controller调用 这里只测试url调用,GET
     * @throws Exception
     */
    @Test
    public void list() throws Exception {
        String url = "/central/wesker/group/list";
        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(url).accept(MediaType.APPLICATION_JSON)).andReturn();
        int status = mvcResult.getResponse().getStatus();
        Assert.assertEquals(200, status);
        String content = mvcResult.getResponse().getContentAsString();
        System.out.println("content : " + content);
    }

    /**
     * 测试controller调用,POST
     * @throws Exception
     */
    @Test
    public void login() throws Exception {
        Map<String,String> user = new HashMap<>(3);
        user.put("admin","wesker");
        user.put("pwd","123");
        String url = "/central/login";
        MvcResult mvcResult = loginMvc.perform(MockMvcRequestBuilders.post(url)
                .content(JSON.toJSONString(user))
                .contentType(MediaType.APPLICATION_JSON))
                .andReturn();
        int status = mvcResult.getResponse().getStatus();
        Assert.assertEquals(200, status);
        String content = mvcResult.getResponse().getContentAsString();
        System.out.println(content);
    }

@RunWith 是JUnit标准和一个注解,用来告诉JUnit单元测试框架不要使用内置的方式进行单元测试,而应使用 RunWith 指明的类来提供单元测试,所有的 Spring 单元测试总是使用SpringRunner.class

@SpringBootTest 用于 Spring Boot 应用测试, 它默认会根据包名逐级往上找,一直找到 Spring Boot 主程序,也就是通过类注解是否包含@SpringBootApplication来判断是否是主程序,并在单元测试的时候启动该类来创建Spring上下文环境。

@Transactional 是用于事务回滚的注解。因为此处测试的是往数据库里添加数据,我们希望Service测试完毕后,数据能自动回滚。但nosql一般不支持回滚

单元测试中不准使用System.out进行人肉验证,必须使用assert进行验证

推荐阅读更多精彩内容