pring对Controller、Service、Dao进行Junit单元测试总结
所有用Junit进行单元测试,都需要下面的配置
1 2 3 | @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) |
applicationContext.xml 是整个项目的Spring的配置文件。包括数据源配置、MVC配置和各种Bean的注册扫描。如果你是多个文件,就用都好隔开写多个,像这样
1 | { "classpath:applicationContext.xml","classpath:servlet-context.xml"} |
1.Dao层的单元测试。
将*Mapper接口注入进来,直接调用即可。加上@Transactional 事物管理注解以后,单元测试执行完后会撤销对数据库的修改。想看增删改的结果的话,可以把这个注解先注释。
~~~java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package testDao;import com.susq.mbts.dao.UserMapper; import com.susq.mbts.domain.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional;import java.util.Date;/** * Created by susq on 2017-5-3. */@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {“classpath:applicationContext.xml”}) @Transactionalpublic class DaoTests { @Autowiredprivate UserMapper userMapper;@Testpublic void testSelect() { User userInfo = userMapper.selectByPrimaryKey(1L); System.out.println(userInfo);}@Testpublic void insert(){ User user = new User();// user.setId(5L); user.setAge(“9”); user.setName(“王五”); user.setSex(“M”); user.setCreateTime(new Date()); userMapper.insert(user); }@Testpublic void testUpdate() { User user = new User(); user.setId(5L); user.setAge("999"); user.setName("王五"); user.setSex("M"); user.setCreateTime(new Date()); userMapper.updateByPrimaryKey(user);}@Testpublic void testDelete() { userMapper.deleteByPrimaryKey(7L);}} |
2. Service层的单元测试与Dao层基本一致,把Service注入进来调用就行。
~~~java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package testDao;import com.susq.mbts.domain.User; import com.susq.mbts.service.UserService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/** * Created by susq on 2017-5-8. */@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {“classpath:applicationContext.xml”}) public class Sertest { @Autowiredprivate UserService userService;@Testpublic void selectUserTest() { User u = userService.selectUser(1); System.out.println(u);}} |
3. Controller层的单元测试
一种是把Controller的Bean注入进来,调里面的方法,这很显然比较扯淡,连Url都没经过,只测了方法。另一种是使用MockMvc模拟通过url的接口调用。MockMvc是SpringMVC提供的Controller测试类,每次进行单元测试时,都是预先执行@Before中的setup方法,初始healthArticleController单元测试环境。
注意:一定要把待测试的Controller实例进行MockMvcBuilders.standaloneSetup(xxxxController).build(); 否则会抛出无法找到@RequestMapping路径的异常:No mapping found for HTTP request with URI [/cms/app/getArticleList] in DispatcherServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package testDao;import com.susq.mbts.controller.UserController;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.ResultActions;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.setup.MockMvcBuilders;/** * Created by susq on 2017-5-8. */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:applicationContext.xml"})public class ConTest { @Autowired private UserController userController; private MockMvc mockMvc; @Before public void setup(){ mockMvc = MockMvcBuilders.standaloneSetup(userController).build(); } @Test public void Ctest() throws Exception { ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/show_user3").param("id", "1")); MvcResult mvcResult = resultActions.andReturn(); String result = mvcResult.getResponse().getContentAsString(); System.out.println("=====客户端获得反馈数据:" + result); // 也可以从response里面取状态码,header,cookies...// System.out.println(mvcResult.getResponse().getStatus()); }} |