发表于: 2017-12-19 23:24:16
0 569
一.今日完成
1.上午解决师弟做任务中遇到问题,在Spring+JUnit单元测试中,加载和初始化业务层Spring容器,通过属性注入方式装配Bean,调用Bean的方法提示空指针异常,需要在类一级添加@Runwith注解.相关知识点如下:
(1)@RunWith注解
官方文档解释:
When a class is annotated with @RunWith or extends a class annotated with @RunWith, JUnit will invoke the class it references to run the tests in that class instead of the runner built into JUnit.
JUnit用例都是在Runner(运行器)来执行的。通过它,可以为这个测试类指定一个特定的Runner。那么大多数时候没有使用@RunWith这个注解,因为JUnit中有一个默认的Runner,它的名字叫BlockJunit4ClassRunner,但这是在JUnit4.4之后才引入的,对于4.4之前版本的JUnit,它的名字叫Junit4ClassRunner。在新版本的源代码中已经添加了注释来说明这个问题:
/**
* @deprecated Included for backwards compatibility with JUnit 4.4. Will be
* removed in the next major release. Please use
* {@link BlockJUnit4ClassRunner} in place of {@link JUnit4ClassRunner}.
*/
@Deprecated
public class JUnit4ClassRunner extends Runner implements Filterable, Sortable {
...
关于Spring项目的单元测试,就是用JUnit加载Spring的配置文件以完成Context的初始化,然后从Context中取出Bean并完成测试,需要使用@RunWith注解,表明这个类中的测试用例需要使用SpringJUnit4ClassRunner类来执行。
(2)@RUNWITH(SUITE.CLASS)
其作用是使用JUnit执行一个测试套件。Suite类是JUnit自带的,意为套件,顾名思义,就是一套东西。通过它,可以把多个相关的测试类看做一个测试套件一起测试。
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({ TestA.class, TestB.class, /*Any test class you want to run*/})
public class TestSuite {
// Please note this case won't run. It will only run cases which
// are configured in @Suite.SuiteClasses
@Test
public void testPrint() {
System.out.println("Hello");
}
}
@RunWith指定了Suite类,说明这个TestSuite类是一个套件。通过@Suite.SuiteClasses指定了要执行的测试类(这些类中的所有用例都会执行)。
需要注意的是,这个TestSuite类本身用例则不会执行了(如上面的testPrint()方法)。
(3)@RUNWITH(PARAMETERIZED.CLASS)
Parameterized类也是JUnit自带的,用于使用多个参数组合多次执行同一个测试用例。
使用Parameterized注解需要注意几点:
a.该方法要有构造函数
b.有一个public static的方法被@Parameters标注,并且该方法只能返回Iterable类型或数组类型的数据(源代码是如下处理的)
(4)@RUNWITH(CATEGORIES.CLASS)
顾名思义,执行一个“类别”。和Suite类似,只是Suite是执行指定类中的所有用例,而Categories执行的范围更小,是在Suite的基础上只执行指定的“类别”的用例。这就需要事先在各个测试用例上用@Category标注该用例属于那些“类别”,之后便可以通过类别来选择执行某些用例。
(5)@RUNWITH(THEORIES.CLASS)
提供一组参数的排列组合值作为待测方法的输入参数。同时注意到在使用Theories这个Runner的时候,待测方法可以拥有输入参数,而这在其它的Runner中的测试方法是不行的。
2.下午继续写了文学部前台文章详情页接口.
二.明日计划
1.上午指导师弟使用mybatis作为持久化技术实现对数据库的增删改查操作;
2.今天晚上听了前端组员方案评审会,发现后端文学部接口文档和方案设计需要做微调,计划上午改完;
3.开始写后台接口.
三.遇到问题
暂无.
四.收获
1.通过解决别人的问题,加深了对IoC容器和Bean多种装配机制的理解;
2.加深了对单元测试的认识,以前以为单元测试就是调用业务层/持久层/表现层的方法,测试其运行结果,但是这两天处理bug的过程令人认识到,单元测试与测试框架是紧密结合的,不同的测试框架采用的配置和测试流程都是需要去学习和掌握的,按照工具的逻辑去执行测试,可以弥补自身考虑欠周全或者实现底层代码不能轻易完成的功能.
评论