Spring Service、Dao进行Junit单元测试

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());
     }
}

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());
     }
}

猜你喜欢

转载自www.cnblogs.com/jpfss/p/10954274.html