一.Junit
-
Junit简介
- JUnit是一个Java语言的单元测试框架,用于单元测试.
- 以前我们测试的时候,一般是单独创建一个测试类,在里面写一个main方法来测试我们的程序,但是实质上这样用main来做测试是不规范的,因为main方式它是一个应用程序的入口,它应该作为主逻辑来运行的,而我们的测试是辅助来做的.其次,一个类只有一个main方法(入口),如果我们现在有很多的代码需要测试怎么办?以前我们是封装成很多方法,依次在main里面调用或者是在main里面测试完一个注释掉写下一个,那这样很麻烦也有很多限制.而 Junit 能很好的解决这个问题,简化单元测试,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。
-
Junit的使用
- 前提是我们需要导入Junit的jar包.我们用的eclipse中已经继承了Junit了,不需要我们去下载jar啦
- 基本步骤:
- ①:选中项目,右键Build Path--->Add Libraries...
- ②:弹出来的Add Library界面中,找到 JUnit并选中,点击 next
- ③:弹出的JUnit Library界面,我们在下来框中选择JUnit4,最后点击finish就可以了.
- 下面我们看一下代码
- 下面是我们需要测试的类:
-
package test; public class Test2 { public void f(){ System.out.println("test"); } }
如果我们需要测试上面的f方法,以前我们是下面这么做的:
-
public static void main(){ Test2 test2 = new Test2(); test2.f(); }
现在我们不用main方法,使用Junit来测试:
-
我们只需要将需要测试的方面上面加上@Test即可.然后鼠标放在需要测试的方法中,右键,Run As ---->JUnit Test.
package test; import org.junit.Test; public class Test2 { @Test public void f(){ System.out.println("test"); } }
运行结果出现如下的绿色横条,则测试通过,红色横条,则测试失败
-
-
-
上面是简单模拟Junit的使用,这里介绍Junit的几个常用的类似于@Test的注解:
- @Before: 每一个测试方法之前运行
- @After: 每一个测试方法之后运行
- @BeforeClass: 方法必须必须要是静态方法(static 声明),所有测试开始之前运行,注意区分before,是所有测试方法
- @AfterClass: 方法必须要是静态方法(static 声明),所有测试结束之后运行,注意区分 @After
- @Ignore: 被忽略的测试方法:加上之后,暂时不运行此段代码
- 例如上面的例子,我们希望每个测试的方法前面都要先打印before,那么我们可以下面这样
-
注意:编写测试类的原则:
- ①测试方法上必须使用@Test进行修饰
- ②测试方法必须使用public void 进行修饰,不能带任何的参数
- ③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
- ④测试类所在的包名应该和被测试类所在的包名保持一致
- ⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
- ⑥测试类使用Test作为类名的后缀(不是必须)
- ⑦测试方法使用test作为方法名的前缀(不是必须)
-
二.Spring整合Junit
- 下面看我们下面的代码
-
package test; import org.springframework.beans.factory.annotation.Autowired; import service.UserService; public class Test { @Autowired UserService servie; @org.junit.Test public void test(){ servie.addUser(); servie.deleteUser(); } /*public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService service = ac.getBean("userservice", UserService.class); service.addUser(); service.deleteUser(); }*/ }
上面的代码时我们前面从容器获取UserService对象用到的.我们有这样的思考,UserService这个对象我们的spring中上下文已经通过对包的扫描得到了(也就是它已经在我们的容器中被管理了),那我们能否不需要main方法,通过Junit和依赖注入的方式测试test这个方法呢?但是上面的代码能否运行成功呢?答案肯定是不能的.因为我们要把UserService这个成员变量注入的话,有个前提是我们得先把上下文加载了.这里面上下文都没有呢,怎么注入呢?这个时候我们就可以使用spring整合Junit,让它来实现上下文的加载然后再注入.
-
spring整合Junit的前提:需要导入一个spring-test-XX.jar的jar包.
package test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import service.Userservice; @RunWith(SpringJUnit4ClassRunner.class)//执行器 @ContextConfiguration(locations="classpath:applicationContext.xml")//加载配置文件,咱们的配置文件在src下,所以这里写classpath public class Test { @Autowired Userservice service; @org.junit.Test public void test(){ service.addUser(); service.deleteUser(); } }
这里注意两点:我们的执行器是spring整合Junit的执行器;另外一个在我们注入成员变量的对象之前,要加载配置文件,因为加载了配置文件,才回去扫描这个对象是否在我们容器中管理,只有在管理了并且拿到这个容器之后才能注入.