Junit4TestCase

  • 格式:doc
  • 大小:108.00 KB
  • 文档页数:6

1.为什么用Junit?在我们写好一个模块后,经常会遇到一些问题,但是不知道问题出在哪一层,因此我们就对service层、dao层进行测试,来确定问题出现在哪一层。

2.T estCase Demo方案一:1.右击我们的Project,选择new Source Folder,将新文件夹命名为test。

2.已Service为例,右击我们要测试的Service,选择new other,选择JUnit TestCase点击next,选择要测试的方法,选择上setUpBeforeClass点击finish。

3.在测试类中声明一个service类型的静态属性。

private static UserService userService;在生成的setUpBeforeClass()方法中,加载配置文件,并拿到一个UserService的实例。

ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext-infrastructure.xml");userService = (UserService) context.getBean("userService");4.重写domain类的hashCode()和equals()方法,可以用eclipse自动生成。

自动生成时选上所有的属性。

5.每个Junit Test方法都必须遵循的原则是运行完成后不能改变数据。

可以将增删放在一起测试,将要新增的对象为ojbect1,在新增之后查出新增的数据,通过object1的id得到对象object2,判断object1是否equals(object2)(相等则新增测试通过),然后删除,再通过id查询得到对象object3,判断object3是否为null(为null则删除测试通过)。

改操作测试,先根据id查要修改的数据object4,再根据object5修改数据库中的数据(object5.id=objcet4.id),再根据id查修改后的数据得到object6,判断object5是否equals (object6),(相等则修改测试通过),然后将object4做为参数修改数据库中的数据,根据id从数据库拿出数据得到object6,判断object4是否equals(object6),相等则修改测试通过。

方法介绍:assertEquals():一般写三个参数,第二个参数o1和第三个参数o2都为object类型,当o1.equals(o2)为true时,测试通过,第一个参数str为String类型,当测试不通过(o1.equals(o2)为false时),str会在Failure Trace中显示出来。

assertNull():判断参数是否为空,为空则通过,否则,则不通过。

assertNotNull():预言参数非空,非空则通过,否则,则不通过。

assertTrue():预言参数为True,True则通过,False,则不通过。

还有一些方法不经常用,没列出来,在一个test方法中,如果用上述assert方法断言失败(没通过),则下面的代码不会执行。

各个test方法是一个独立的test unit。

@Testpublic void testAdd_Find_RemoveUser() {User user = new User(1,"Damon");userService.addUser(user);User u = new User();u = userService.findUser(1);assertEquals("insert fail",user,u);userService.removeUser(1);u = userService.findUser(1);assertEquals("delete fail",u,null);}@Testpublic void testModifyUser() {User user1 = new User();user1 = userService.findUser(2);User user2 = new User(2,"Gene");userService.modifyUser(user2);user2 = userService.findUser(2);userService.modifyUser(user1);User user3 = new User();user3 = userService.findUser(2);assertEquals("update fail",user1,user3);}6.如果想测试该类所有的方法,可以选中该测试类,右键Run As Junit Test,如果所有的方法测试都通过,则会出现显示所有的方法都通过。

如果有方法没通过则可以根据方法名和提示信息定位到出错的位置。

7.Junit Test的其他用法@Ignore:如果想测试整个类中除个别方法以外的其他方法,则可以在不想测试的方法上面加上@Ignore如果你像一个一个方法测试,那就没必要加@Ignore,在测试类中选中方法名,右键Run As Junit Test,这样就只会测试你选中的方法。

@Test中可以加参数expected=Exception.class,timeout=1000Expected的参数指的是,如果要测试的方法抛出你指定的异常,该方法才能通过。

Timeout可以测试循环,判断测试方法内有没有死循环,单位是毫秒8.Mapper层的测试和Service的测试基本一致,只是static属性定义你要测的mapper在beforeClass中,只需要修改getBean的参数和强制类型转换的类型。

方案二:方案一中的操作比较死板,为了在运行测试方法后不改变数据库中的数据,我们可以用sping-test包中的类,继承某些类可以只生成一个service对象,并支持自动回滚(进行玩增删改操作之后,事务会自动回滚,不用自己还原数据了)。

注意:er类的hashCode()和equals()仍需要重写。

2.Mapper方法中的<cache />要去掉,即不用cache。

1.测试类继承AbstractTransactionalDataSourceSpringContextTests,在类体中定义private static UserService userService;protected String[] getConfigLocations(){return new String[]{"applicationContext-infrastructure.xml"}; }@Overrideprotected void onSetUpInTransaction() throws Exception{u serService =(UserService)applicationContext.getBean("userService");}@Testpublic void testRemoveUser(){User u = new User();userService.removeUser(2);u = userService.findUser(2);assertNull(u);}@Testpublic void testAddUser(){User user = new User(1,"Damon");userService.addUser(user);User u = new User();u = userService.findUser(1);assertEquals("insert fail",user,u);}@Testpublic void testFindUser(){U ser user = new User();u ser = userService.findUser(2);S ystem.out.println(user.getId()+":"+user.getName());}@Testpublic void testModifyUser() {User user1 = new User();user1 = userService.findUser(2);User user4 = new User();User user2 = new User(2,"Gene");user4 = user2;userService.modifyUser(user2);user2 = userService.findUser(2);assertEquals("4 2",user4,user2);userService.modifyUser(user1);User user3 = new User();user3 = userService.findUser(2);assertEquals("update fail",user1,user3);}2.经测试该方法中的事物是可以回滚的。

但是继承的方法类是过时的。

方案三:(推荐使用)方案二中的继承类过时了,所以我们找到了另外一个类完成此功能AbstractTransactionalJUnit4SpringContextTests。

注意:er类的hashCode()和equals()仍需要重写。

2.Mapper方法中的<cache />要去掉,即不用cache。

1.该测试类继承AbstractTransactionalJUnit4SpringContextTests类。

在类上加注解@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="/applicationContext-infrastructure.x ml")2.在类体中定义将要测试的service或mapper@Autowiredprivate UserMapper userMapper;3.像方案二中写测试方法就可以了,userMapper可以拿过来直接用。

@Testpublic void testInsertUser() {User user = new User(1, "Damon");userMapper.insertUser(user);User u = new User();u = userMapper.selectUser(1);assertEquals("insert fail", user, u);}@Testpublic void testSelectUser() {User user = new User();user = userMapper.selectUser(2);System.out.println(user.getId()+":"+user.getName());}// 四个test方法一起跑,该测试方法有问题,但是单独跑该测试方法,没有问题。