Unitils框架与模块扩展
Unitils这个Java开源包的目的是让单元测试变得更加容易和维护。Unitils构建在DBUnit与EasyMock项目之上并与JUnit和TestNG相结合,支持数据库测试,支持利用mock对象进行测试并提供与Spring和Hibernate相集成。Unitils设计成以一种高度可配置和松散偶合的框架来添加这些服务到单元测试中,其模块化的管理方式使Unitils更易进行扩展。
1,JUnit4ClassRunner简介
所有的测试方法test method都是在Runner下执行的,可以将Runner理解为junit运行的容器,默认情况下junit会使用JUnit4ClassRunner作为所有test method的执行容器。如果要定制自己的junit,则可以实现自己的Runner,最简单的办法就是Junit4ClassRunner继承,spring-test,unitils这些框架就是采用这样的做法。如在spring中是SpringJUnit4ClassRunner,在unitils中是UnitilsJUnit4TestClassRunner。
JUnit4ClassRunner的构造器如下:
public JUnit4ClassRunner(Class< ?> klass) throws InitializationError { fTestClass= new TestClass(klass); fTestMethods= getTestMethods(); validate(); } |
JUnit4ClassRunner没有默认的构造器, 从构造器代码中我们可以看出, 它需要一个参数, 这个参数就是我们当前要运行的测试类test class, Runner拿到了要执行的测试类之后, 就可以进一步拿到需要执行的测试方法, 这些动作是通过注解获得。这个测试的运行是通过runner中的run()方法执行:
@Override public void run(final RunNotifier notifier) { new ClassRoadie(notifier, fTestClass, getDescription(), new Runnable() { public void run() { runMethods(notifier); } }).runProtected(); } |
这个run方法里就会按照junit定义的顺序依次执行被@BeforeClass、@Before、@Test、@After、@AfterClass标记的方法。
2,UnitilsJUnit4TestClassRunner
Unitils的runner在继承了Junit4 runner的基础上进一步改写了run()方法来定义自己的执行顺序:
从图中可以看到,整个Unitils在运行期间,在执行Junit4的@BeforeClass前会执行Unitils的beforeTestClass方法,然后执行被Junit4的@BeforeClass标签标注的方法,再依次执行afterCreateTestObject、beforeTestSetUp、@Before……等方法。