• 只能对public方法进行测试
  • eclipse创建测试类的话是右键类->junit测试用例,然后下一步选中要测试的方法,然后把整个方法体搬到对应的测试方法中,要测试哪个方法直接在侧边栏该方法上右击选择Junit方法测试即可,不用写main方法。
  • 以下为测试保存一个学生到数据库的类

     public class StudentTestTest {
    
         private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
    
         @Test
         public void testAdd() {
             Session session=sessionFactory.openSession(); // 生成一个session
             session.beginTransaction(); // 开启事务
    
             Student s=new Student();
             s.setName("张三");
             session.save(s);
    
             session.getTransaction().commit(); // 提交事务
             session.close(); // 关闭session
         }
    }
    
  • 代码实例:eclipse->HibernateCrud
  • 一般我们会在测试类中加上测试前方法和测试后方法。以下为测试多对一的学生类和班级类,分别保存同一班的两名学生的方法。

    public class StudentTestTest {
    
        //因为下面两个方法都要用到这俩属性,所以实例化在外面
        private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
        private Session session;
    
        @Before //测试前调用
        public void setUp() throws Exception {
            session=sessionFactory.openSession();
            session.beginTransaction();
        }
    
        @After //测试后调用
        public void tearDown() throws Exception {
            session.getTransaction().commit();
            session.close();
        }
    
        @Test
        public void  testSaveClassAndStudent() {
            Class c=new Class();
            c.setName("08计本");
            session.save(c);
    
            Student s1=new Student();
            s1.setName("张三");
            s1.setC(c);
    
            Student s2=new Student();
            s2.setName("李四");
            s2.setC(c);
    
            session.save(s1);
            session.save(s2);
        }
    
    }
    
  • 多个@Test方法同时执行的话顺序是随机且每次都不确定的
  • junit-4.11开始可以用@FixMethodOrder来指定顺序,但就是不能指定按方法定义的顺序执行,所以最好就是一个方法一个方法单独执行

    //@FixMethodOrder(MethodSorters.JVM) //按JVM顺序,随机不确定,默认按此方式
    @FixMethodOrder(MethodSorters.DEFAULT) //随机确定
    //@FixMethodOrder(MethodSorters.NAME_ASCENDING) //按命名顺序
    public class StudentTest2 {
        private static final Logger logger=Logger.getLogger(StudentTest2.class);
        private SqlSession sqlSession;
        private StudentMapper studentMapper;
    
        /**
         * 方法执行前打开一个连接
         * setUp方法可以用于初始化变量
         * @throws Exception
         */
        @Before
        public void setUp() throws Exception {
            sqlSession=SqlSessionFactoryUtil.openSession();
            studentMapper=sqlSession.getMapper(StudentMapper.class);
        }
    
        /**
         * 方法执行后回收连接
         * @throws Exception
         */
        @After
        public void tearDown() throws Exception {
            sqlSession.close();
        }
    
        @Test
        public void testAdd() {
            logger.info("添加学生");
            Student student=new Student(4,"李四",14);
            studentMapper.add(student);
            sqlSession.commit();
        }
    
        @Test
        public void testUpdate() {
            logger.info("修改学生");
            Student student=new Student(3,"张三",13);
            studentMapper.update(student);
            sqlSession.commit();
        }
    }
    
  • 贴4.11及以上的jar包要同时贴上hamcrest-core的jar包,不然报java.lang.NoClassDefFoundError

    @After、@Before注解

  • Junit4开始使用Java5的注解,常用的:
    • @BeforeClass:针对一个类的all测试,只执行一次,被注解方法必须为static void。
    • @Before:初始化方法。
    • @Test:测试方法。
    • @After:测试后执行的方法,通常是释放资源的。
    • @AfterClass:针对all测试,只执行一次,必须为static void。
    • @Ignore:忽略的测试方法。
  • 一个单元测试用例的执行顺序:@BeforeClass->@Before->@Test->@After->@AfterClass
  • 每个测试方法的执行顺序:@Before->@Test->@After