1、需求:
希望在对做MyBatis做单元测试的时候,新增、修改、删除可以一直可测试,这样在新增功能时,能够保证软件的质量随着功能的迭代而不至于下降。
2、项目目录
3、项目文件pom.xml
4、项目文件web.xml
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
5、前端页面:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
6、单元测试目录:
7、单元测试文件:SpringTestCase.java
package com.lin.baseTest;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
/**
* 功能概要:
*
* @author linbingwen
* @since 2015年9月28日
*/
//指定bean注入的配置文件
@ContextConfiguration(locations = { "classpath:application.xml" })
//使用标准的JUnit @RunWith注释来告诉JUnit使用Spring TestRunner
@RunWith(SpringJUnit4ClassRunner.class)
/*添加事务回滚20180516*/
@Transactional
//@TransactionConfiguration(transactionManager = "transactionManager")
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
public abstract class SpringTestCase extends AbstractTransactionalJUnit4SpringContextTests //AbstractJUnit4SpringContextTests
{
protected Logger logger = LoggerFactory.getLogger(getClass());
}
8、单元测试文件:UserServiceTest.java
package com.lin.service;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.lin.baseTest.SpringTestCase;
import com.lin.domain.User;
/**
* 功能概要:UserService单元测试
*
* @author linbingwen
* @since 2015年9月28日
*/
public class UserServiceTest extends SpringTestCase {
@Autowired
private UserService userService;
Logger logger = Logger.getLogger(UserServiceTest.class);
@Test
public void selectUserByIdTest(){
User user = userService.selectUserById(10);
logger.debug("查找结果" + user);
// logger.debug("查找结果" + "空测试方法!");
}
@Test
public void addUserTest(){
User user=new User();
// user.setUserEmail("email");
// user.setUserName("name");
// user.setUserPassword("password");
user.setUserEmail("boyzhaohy@vip.sina.com");
user.setUserName("Auroral");
user.setUserPassword("2319474666");
userService.addUser(user);
logger.debug("新增用户ID" + user.getUserId());
// logger.debug("查找结果" + "空测试方法!");
}
}
9、资源目录
10、资源文件:log4j.properties
log4j.rootLogger=DEBUG,Console,Stdout
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.appender.Stdout = org.apache.log4j.DailyRollingFileAppender
log4j.appender.Stdout.File = E://logs/log.log
log4j.appender.Stdout.Append = true
log4j.appender.Stdout.Threshold = DEBUG
log4j.appender.Stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
11、资源文件:application.xml
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
12、资源文件:spring-mvc.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
13、资源文件:jdbc.properties
jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/learning
jdbc_username=root
jdbc_password=2319474666
14、资源文件:mybatis-config.xml
一个空的文件
"http://mybatis.org/dtd/mybatis-3-config.dtd">
15、业务逻辑目录
16、服务实现类UserServiceImpl.java
package com.lin.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lin.dao.UserDao;
import com.lin.domain.User;
/**
* 功能概要:UserService实现类
*
* @author linbingwen
* @since 2015年9月28日
*/
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
public User selectUserById(Integer userId) {
return userDao.selectUserById(userId);
}
/**
* 新增添加用户接口,目的是在单元测试中
* 测试事务回滚,20180516
* */
public void addUser(User user){
userDao.addUser(user);
}
}
17、服务接口类:UserService.java
package com.lin.service;
import org.springframework.stereotype.Service;
import com.lin.domain.User;
/**
* 功能概要:UserService接口类
*
* @author linbingwen
* @since 2015年9月28日
*/
public interface UserService {
User selectUserById(Integer userId);
/**
* 新增添加用户接口,目的是在单元测试中
* 测试事务回滚,20180516
* */
public void addUser(User user);
}
18、映射文件:UserMapper.xml
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
insert into t_user(USER_NAME ,USER_PASSWORD ,USER_EMAIL )
values(#{userName},#{userPassword},#{userEmail})
19、领域对象User.java
package com.lin.domain;
/**
* User映射类
*
* @author linbingwen
* @time 2015.5.15
*/
public class User {
private Integer userId;
private String userName;
private String userPassword;
private String userEmail;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName
+ ", userPassword=" + userPassword + ", userEmail=" + userEmail
+ "]";
}
}
20、数据访问接口:UserDao.java
package com.lin.dao;
import com.lin.domain.User;
/**
* 功能概要:User的DAO类
*
* @author linbingwen
* @since 2015年9月28日
*/
public interface UserDao {
/**
*
* @author linbingwen
* @since 2015年9月28日
* @param userId
* @return
*/
public User selectUserById(Integer userId);
/**
* 新增添加用户接口,目的是在单元测试中
* 测试事务回滚,20180516
* */
public void addUser(User user);
}
21、控制层类:UserController.java
package com.lin.controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.lin.domain.User;
import com.lin.service.UserService;
/**
* 功能概要:UserController
*
* @author linbingwen
* @since 2015年9月28日
*/
@Controller
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/")
public ModelAndView getIndex(){
ModelAndView mav = new ModelAndView("index");
User user = userService.selectUserById(1);
mav.addObject("user", user);
return mav;
}
}
22、运行效果:
测试网址:
http://localhost:8060/ssm_project/
参考网址:
http://yaoyao.codes/spring/2013/10/12/spring-tricks,事务不回滚原因分析
https://www.kancloud.cn/evankaka/springlearning/119674,图文结合入门教程