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”}) @Transactional public class DaoTests { @Autowired private UserMapper userMapper; @Test public void testSelect() { User userInfo = userMapper.selectByPrimaryKey(1L); System.out.println(userInfo); } @Test public void insert(){ User user = new User(); // user.setId(5L); user.setAge(“ 9 ”); user.setName(“王五”); user.setSex(“M”); user.setCreateTime( new Date()); userMapper.insert(user); } @Test public void testUpdate() { User user = new User(); user.setId(5L); user.setAge( "999" ); user.setName( "王五" ); user.setSex( "M" ); user.setCreateTime( new Date()); userMapper.updateByPrimaryKey(user); } @Test public 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 { @Autowired private UserService userService; @Test public 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()); } } |