以前都是用junit3.8的,前段时间改用junit4了,采用包为:Spring2.5.6+junit4.6(注意:必须添加spring-test.jar)
1. 编写测试基类,如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/applicationContext.xml"})
@TransactionConfiguration(defaultRollback=true)
@Transactional
public class BaseTransactionTest{
}
其中:
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
transactionManager的默认取值是“transactionManager”,defaultRollback的默认取值是true,当然,你也可以改成false。true表示测试不会对数据库造成污染,false的话当然就会改动到数据库中了。如果你的事务控制名字就是定义成transactionManager,并且确实需要在测试用例中不污染数据库的话,那么,上面这句话就可以直接写
@TransactionConfiguration
甚至直接省略掉。不过下面的这句
@Transactional
可不能省略。
2. 编写测试类,如下:
public class TestStudentDao extends BaseTransactionTest{
@Autowired
private StudentDao studentDao;
@Test
public void getStu(){
Student stu = new Student();
student.setName("张三");
studentDao.save(student);
}
}
执行以上测试用例,数据库中并不会增加这个叫张三的学生的纪录,也就是不会污染数据库了。但是,如果你的主键用的是自增长的话,那么,现在下次取主键的值已经在在原先的基础上+1了,所以说这个并不算是真正的不污染数据库。
但是如果我继承自这个基类的测试类里需要“污染数据库”呢?spring也考虑到了这点,所以你可以在方法名上添加@Rollback(false)表示这个测试用例不需要回滚。
注意:尽量避免事务嵌套。如果你要对某个拥有事务的方法进行测试的话,最好就不要再继承上面的这个基类,而是使用下面这个。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/applicationContext.xml"})
public class BaseTest{
}
在Junit3.8版本中有个TestSuite,在junit4中需要进行多个测试的话代码如下:
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestStudentDao.class,
TestTeacherDao.class
})
public class RunAllTestsSuite {
}
需要测试多个的,继续添加class吧
注意:如果junit的版本跟spring版本不对的情况下,会出现如下异常:
org/junit/Assume$AssumptionViolatedException; nested exception is java.lang.NoClassDefFoundError: org/junit/Assume$AssumptionViolatedException
具体原因跟解决方式请看:http://thorndike.iteye.com/blog/263197
不过该链接提供的解决方式有个缺点,就是测试数据会污染数据库,不论你defaultRollback=true还是false,所以如果你使用的Junit版本不是4.4的话,最好升级(或者降级)到4.4版本,因为spring2.5提供的spring-test使用的junit就是基于4.4版本的,而spring2.5系列已经不再更新了。。