关于Junit4单元测试

以前都是用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系列已经不再更新了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值