單元測試包結構和源碼結構必須保持一致,以下圖所示:java
單元測試文件名字是由「被測試文件名 + Test」組成,以下圖所示git
被各個單元測試繼承,代碼以下web
package com.cntest.su.demo; import com.cntest.su.DemoApplication; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Description: 基礎測試類 * Date: 2018/3/7 14:23 */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes =DemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public abstract class BaseTest { }
Controller負責restful接口輸出,測試包括post接口和get接口spring
接口測試參照如下代碼restful
package com.cntest.su.demo.controller; import com.cntest.su.demo.BaseTest; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; 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; /** * Description: controller test demo * Date: 2018/3/7 11:34 */ public class DemoControllerTest extends BaseTest{ //@Autowired private MockMvc mockMvc; @Autowired private WebApplicationContext wac; @Before public void setup(){ //MockMvcBuilders使用構建MockMvc對象 (項目攔截器有效) mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //單個類 攔截器無效 // mockMvc = MockMvcBuilders.standaloneSteup(userController).build(); } /** * test hi interface * * @throws Exception */ @Test public void testHi() throws Exception { String name = "test"; // 一、get查一下接口 RequestBuilder request = get("/demo/hi").param("name", name); mockMvc.perform(request) .andExpect(status().isOk()) .andExpect(content().string("hi:" + name)); } }
service層負責業務邏輯的實現,單元測試規範參照如下代碼post
package com.cntest.su.demo.service; import com.cntest.su.demo.BaseTest; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; /** * Description: service unit test * Date: 2018/3/7 14:23 */ public class DemoServiceTest extends BaseTest { @Autowired private DemoService demoService; @Test public void testHi(){ String name = "test"; Assert.assertEquals(demoService.hi(name), "hi:" + name); } }
dao層負責數據的獲取,單元測試參照如下代碼單元測試
package com.cntest.su.demo.dao; import com.cntest.su.demo.BaseTest; import com.cntest.su.demo.entity.User; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; /** * Description: demo dao test * Date: 2018/3/7 14:57 */ @Transactional public class UserDaoTest extends BaseTest { @Autowired private UserDao userDao; @Test @Rollback public void testGet() { userDao.insert(3, "AAA", 20); User u = userDao.getById(3); Assert.assertEquals(20, u.getAge().intValue()); Assert.assertEquals("AAA", u.getName()); } }
源代碼地址:https://gitee.com/xszhangmin/unit_test_demo/tree/master測試