发表于: 2017-12-19 23:24:16

0 570


一.今日完成

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的过程令人认识到,单元测试与测试框架是紧密结合的,不同的测试框架采用的配置和测试流程都是需要去学习和掌握的,按照工具的逻辑去执行测试,可以弥补自身考虑欠周全或者实现底层代码不能轻易完成的功能.




返回列表 返回列表
评论

    分享到