import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;
import shop.constant.ShopCommonConstant;
/**
* 1.指定测试用例运行器
*/
@RunWith(SpringJUnit4ClassRunner.class)
/**
* 2.事务配置
* transactionManager="这里是applicationContext.xml文件中事务管理器的名称,默认是transactionManager"
* defaultRollback=true 事务执行后是回滚还是提交,如果不希望测试用数据留在数据库中,可以设置为true
* (Spring4.2以后),@TransactionConfiguration已经标注为过时的注解,官方文档
* http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/transaction/TransactionConfiguration.html
*/
//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
/**
* 3.注册测试用例的监听器
* 加入TransactionalTestExecutionListener后,它负责解析 @Transactional、@NotTransactional以及 @Rollback 等事务注解的注解
* @Transaction 注解让测试方法工作于事务环境中,不过在测试方法返回前事务会被回滚。你可以使用 @Rollback(false)
* 让测试方法返回前提交事务。而 @NotTransactional注解则让测试方法不工作于事务环境中。
* 加入DependencyInjectionTestExecutionListener后,可以识别@Autowired,本类的属性名与applicationContext中bean
* id或name相同,则Autowired
*/
//@TestExecutionListeners({ TransactionalTestExecutionListener.class,DependencyInjectionTestExecutionListener.class })
/**
* 使测试用例的所有方法都将工作于事务环境下
*/
@Transactional(transactionManager="transactionManager")
/**
* 4.上下文配置
* locations:指定applicationContext.xml文件的路径,可以通过该属性手工指定 Spring
* 配置文件所在的位置,可以指定一个或多个 Spring
* 配置文件@ContextConfiguration(locations={“xx/yy/beans1.xml”,” xx/yy/beans2.xml”})
* inheritLocations:是否要继承父测试用例类中的Spring配置文件,默认为 true
*/
@ContextConfiguration(locations = { "classpath*:spring.xml","classpath*:spring-mybatis.xml" })
public abstract class AbstractTransactionalSpringContextTest extends
AbstractTransactionalJUnit4SpringContextTests {
public static final String channel = ShopCommonConstant.CHANNEL_GOLD_CODE_H5;
public static final String ip = "192.168.1.58";
public static final String merchantId = "1001";
public static final String manageId = "UR75148161464287982";
public static final String version = "1.0";
public static final String userName = "admin";
public static final String userPassword = "123456";
public static final String requestSign = "1.0";
}
说明:
(1).原defaultRollback属性现在由专门的注解@Rollback(新增注解)代替,其中只有一个属性就是boolean型的value,作用没变,值为true表示测试时如果涉及了数据库的操作,那么测试完成后,该操作会回滚,也就是不会改变数据库内容;值为false则与此相反,表示你测试的内容中对数据库的操作会真实的执行到数据库中,不会回滚。官方文档中还给出了一个新注解@Commit,该注解与@Rollback只能使用一个,同时用貌似可能出现问题,@Commit注解中无属性需要设置,不像@Rollback中还有一个value属性,用了@Commit,你的测试操作会改变数据库,不会回滚,等同于@Rollback(value=false)。这里建议使用@Rollback,不要用@Commit,这样起码你有两种选择可以选。
(2).原来放在@TransactionConfiguration注解中的transactionManager属性现在放在了@Transactionl注解中。
顺便提一下@RunWith注解的作用。
首先我们写了一个测试类,该类中会有许多测试方法,测试方法上面会利用@BeforeClass、@before、@Test、@after、@AfterClass 这5个注解进行测试,类有了,方法有了,那么当你执行某个测试方法时,是由谁来调用的这个测试方法呢,或者说,你执行的测试方法是在哪里运行的呢,答案就是@RunWith注解里面标注的类,也就是说这个注解的作用是告诉系统你执行测试方法时,调用者是谁,这里就是SpringJunit4ClassRunner类。默认情况下,也就是假如你省略了@RunWith注解,测试类上面不写它,系统默认的是相当于你注解了@RunWith(BlockJUnit4ClassRunner.class),实际上SpringJunit4ClassRunner继承了BlockJUnit4ClassRunner。因为你的项目中使用了Spring,那么测试方法中要测试的内容一般都会用到Spring管理的bean,此时你只能用SpringJunit4ClassRunner而不能用BlockJUnit4ClassRunner了,否则Spring环境中管理的东西你是无法在测试方法中使用的,测试方法拿不到会报空指针。
xml文件
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
测试用例
import model.dubbo.DubboxResponse;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionalEventListener;
import shop.inter.pad.IGoldShopPadOther;
import shop.model.pad.AddUserPadRequest;
import shop.model.pad.ChangePasswordPadRequest;
import shop.model.pad.UserLoginPadRequest;
import shop.model.pad.UserLoginPadResponse;
public class TestIGoldShopPadOther extends
AbstractTransactionalSpringContextTest {
@Autowired
public IGoldShopPadOther goldShopPadOther;
/**
* 销售员登录
*
* @param request
* @return
*/
@Test
@Rollback(value=false)
// @Rollback(value=true)
public void testUserLoginPad() {
UserLoginPadRequest request = new UserLoginPadRequest();
request.setChannel(channel);
request.setIp(ip);
request.setMerchantId(merchantId);
request.setUserName(userName);
request.setUserPassword(userPassword);
request.setVersion(version);
request.setRequestSign(requestSign);
UserLoginPadResponse dr= goldShopPadOther.userLoginPad(request);
System.out.println(dr.getSuccess()==true?"-------------------登录成功-------------------":"-------------------登录失败-------------------");
}
@Test
@Rollback(value=true)
public void testChangePasswordPad() {
ChangePasswordPadRequest request = new ChangePasswordPadRequest();
request.setChannel(channel);
request.setMerchantId(merchantId);
request.setIp(ip);
request.setUserName(userName);
request.setPassword(userPassword);
request.setNewPassword("123456");
DubboxResponse dr= goldShopPadOther.changePasswordPad(request);
System.out.println(dr.getSuccess()==true?"-------------------修改登录密码成功--------------":"-------------------修改登录密码失败-----------");
}
// @Test
// public void testAccountCenterPad() {
// AccountCenterPadRequest request = new AccountCenterPadRequest();
// request.setChannel(channel);
// request.setMerchantId(merchantId);
// request.setIp(ip);
// request.se
// goldShopPadOther.accountCenterPad(request);
// }
// @Test
// public void testAddUserPad() {
// AddUserPadRequest request = new AddUserPadRequest();
// request.setChannel(channel);
// request.setMerchantId(merchantId);
// request.setIp(ip);
// request.setManageId(manageId);
// goldShopPadOther.addUserPad(request);
// }
}