Junit是一个java语言的单元测试框架,用于编写和运行可重复的测试,使用这个框架需要注意以下几点:
1、编写测试类的命名为XXTest,并且需要继承TestCase
2、编写单元测试方法,方法的名称必须为test开头,方法没有返回值,采用public修饰
3、最好将测试程序放在单独的目录中
4、建议使用断言的方式
通过Hibernate的例子我们讲解如何使用Junit:
如图所示的目录结构:
我们需要引入与Hibernate相关的jar包,这里作为了一个库(HIBERNATE3)包在了程序里。HibernateUitls.java是Hibernate的助手类,主要用于读取配置文件
package com.bjpowernode.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory factory;
static{
try{
//读取hibernate.hbm.xml文件
Configuration cfg=new Configuration().configure();
//建立sessionFactory
factory=cfg.buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}
}
public static Session getSession(){
return factory.openSession();
}
public static void closeSession(Session session){
if(session!=null){
if(session.isOpen()){
session.close();
}
}
}
public static SessionFactory getSessionFactory(){
return factory;
}
}
ExportDB.java用于生成数据库表,也即将hbm生成ddl
package com.bjpowernode.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/**
* 将hbm生成ddl
* @author Administrator
*
*/
public class ExportDB {
public static void main(String[] args) {
//默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true,true);
}
}
建立实体User类,然后编写实体的映射文件User.hbm.xml:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
这里指明主键为id,主键的生成策略为uuid,关于主键生成策略上一篇博客中详细的介绍了。
下面就要编写业务处理类了UserManager.java:
package com.bjpowernode.hibernate;
public class UserManager {
public void add(String username){
System.out.println("UserManager.add");
//throw new RuntimeException();
}
public void del(String username){
System.out.println("UserManager.del");
}
public String findUserById(String userId){
return "Tom";
}
}
编写测试类UserManagerTest.java:
package com.bjpowernode.hibernate;
import junit.framework.TestCase;
public class UserManagerTest extends TestCase {
public void testAdd(){
UserManager userManager=new UserManager();
userManager.add("Jack");
System.out.println("UserManagerTest.testAdd()");
}
public void testDel(){
UserManager userManager=new UserManager();
userManager.del("Jack");
System.out.println("UserManagerTest.testDel()");
}
//断言
public void testFindUserById(){
UserManager userManager=new UserManager();
String username=userManager.findUserById("0001");
System.out.println(username);
String expected="Jack";//断言预期值
this.assertEquals(expected, username);//username是断言的实际值
}
}
testFindUserById方法采用的断言的方式,定义一个断言的预期值,然后assertEquals方法输出断言的实际值并和预期值进行比较。
运行的结果:
因为数据库中的数据时Tom,所以执行的结果是数据库中的值,与断言的预期值不一样。
同样在这个例子中,我们讲解Session中的get和load的方法的使用。
public void testGet1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
User user=(User)session.get(User.class, "402880812553589901255358e2b30001");
System.out.println(user.getName());
user.setName("赵六");
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
get方法加载上来的对象为持久化对象,不支持lazy也即延迟加载,换句话说执行了get方法会马上发出查询语句,先查询缓存,如果缓存中存在数据,则直接返回,如果缓存中不存在数据就会转而查询数据库,如果数据库中存在,则返回该对象,如果数据库中不存在,则返回null。
public void testLoad1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
User user=(User)session.load(User.class, "402880812553589901255358e2b30001");
System.out.println(user.getName());
user.setName("王五");
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
load方法支持延迟加载,所以执行load之后不会马上发出查询语句,首先查询一级缓存,如果存在则直接返回对象,如果不存在转而查询二级缓存,如果存在则直接返回对象,如果不存在则继续查询数据库,如果存在则返回对象,如果不存在则会抛出ObjectNotFoundException异常,对于缓存的知识,我们下面的博客详细讲解!