JaveEE测试:第二步-JUNIT自定义

作者: hutou | 来源:发表于2016-07-17 14:19 被阅读183次

自定义加载器

在我们的测试基类中,我们使用了Spring-test提供的加载器

@RunWith(SpringJUnit4ClassRunner.class)  

为了实现上文说的效果,我们需要自定义自己的加载器

public class MyJUnit4ClassRunner extends SpringJUnit4ClassRunner{
    public MyJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
        super(clazz);
    }
}

查看一下SpringJUnit4ClassRunner的源码,他告诉我们应该怎么书写我们的加载器。下面是我们书写的加载器

import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

public class MyJUnit4ClassRunner extends SpringJUnit4ClassRunner{

    private Class<?> clazz;
    
    public MyJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
        super(clazz);
        this.clazz = clazz;
    }

    // 拦截 BeforeClass 事件
    @Override
    protected Statement withBeforeClasses(Statement statement) {
        final Statement junitStatement = super.withBeforeClasses(statement);
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                System.out.println("Before Class: " + clazz.getName());
                junitStatement.evaluate();
            }
 
        };      
    }
    
    // 拦截每一个方法的 Before 事件
    @Override
    protected Statement withBefores(final FrameworkMethod frameworkMethod, Object testInstance, Statement statement) {
        final Statement junitStatement = super.withAfters(frameworkMethod, testInstance, statement);
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                System.out.println("测试类: " + clazz.getName() + "--测试方法: " + frameworkMethod.getName() + " 开始执行!");
                junitStatement.evaluate();
            }
 
        };
    }
    
    // 截获测试类的 AfterClass 事件
    @Override
    protected Statement withAfterClasses(Statement statement) {
        final Statement junitStatement = super.withAfterClasses(statement);
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                junitStatement.evaluate();
                System.out.println("After Class: " + clazz.getName());
            }
        };
    }
    
    // 截获每一个测试方法的 after 事件
    @Override
    protected Statement withAfters(final FrameworkMethod frameworkMethod, Object testInstance, Statement statement) {
        final Statement junitStatement = super.withAfters(frameworkMethod, testInstance, statement);
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                System.out.println("测试类: " + clazz.getName() + "--测试方法: " + frameworkMethod.getName() + " 执行结束!");
                junitStatement.evaluate();
            }
 
        };      
    }
}

使用加载器

修改我们的测试基类即可

//@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(MyJUnit4ClassRunner.class) 

进行测试,会有如下的输出

测试类: com.yun.spring.UserAssignServiceTest--测试方法: insert 执行结束!
测试类: com.yun.spring.UserAssignServiceTest--测试方法: insert 开始执行!

自定义监听器

public class DBUnitTestExecutionListener implements TestExecutionListener {

    @Override
    public void beforeTestClass(TestContext testContext) throws Exception {
    }

    @Override
    public void prepareTestInstance(TestContext testContext) throws Exception {
    }

    /**
     * 在执行测试操作之前
     */
    @Override
    public void beforeTestMethod(TestContext testContext) throws Exception {
        System.out.println(this.getClass().getName() + "--" + testContext.getTestMethod().getName() + " 测试开始");
    }

    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
        System.out.println(this.getClass().getName() + "--" + testContext.getTestMethod().getName() + " 测试结束");
    }

    @Override
    public void afterTestClass(TestContext testContext) throws Exception {
    }  

}

使用监听器

修改上文中的BaseJunit4Test类

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration({
    "classpath:test-hcm-context.xml", 
    "classpath:test-hcm-jpa.xml", 
    "classpath:test-hcm-servlet.xml",
    "classpath:test-hcm-memcache.xml"}) 
//  这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!  
@Transactional  
//  这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时
//  指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!  
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@TestExecutionListeners( { 
    DependencyInjectionTestExecutionListener.class, 
    TransactionalTestExecutionListener.class,
    DBUnitTestExecutionListener.class })  
public class BaseJunit4Test {
}

@TestExecutionListeners中的参数书写我们自定义的监听器来完成某些操作

TestRule的使用

Rule是一个用于测试单元类中定义一个域的标注。虽然叫Rule,但是仍然起拦截器/Interceptor的作用——即在运行测试的前后添加一些有用的代码。这里没有使用,有兴趣自行查看一下文档。

预告

下一步我们将介绍hamcrest的使用方法

相关文章

  • JaveEE测试:第二步-JUNIT自定义

    自定义加载器 在我们的测试基类中,我们使用了Spring-test提供的加载器 为了实现上文说的效果,我们需要自定...

  • JaveEE测试:第一步-简单整合

    目标 项目是基于Spring MVC的JaveEE项目。准备使用Junit4进行单元测试。整合spring-tes...

  • IDEA配置JUnit进行单元测试

    安装JUnitGenerator V2.0 JUnit可以运行JUnit测试文件,但无法自动生成JUnit测试代码...

  • JUnit

    JUnit是用于编写可重复测试的单元测试框架,可实现自动化测试。JUnit官方API文档:http://junit...

  • 自动装配bean 2.2节

    使用junit测试,自动装配 不是junit测试的话,会在web.xml中配置识别注解的xml junit使用下面...

  • JUnit4.12入门实践

    内容概要: 为什么要做单元测试 JUnit简介 单元测试规范 JUnit4常用注解 JUnit4异常和超时测试 J...

  • 测试

    Junit测试

  • junit测试--java13(09/12/2015)

    Junit测试: 1、右键--build path--add library--Junit--Junit4--fi...

  • IDEA 中 JUnit 的使用

    目录 JUnit 是什么? IDEA 的 JUnit 配置 测试类的生成 测试覆盖率的查看 1. JUnit 是什...

  • Java测试工具和框架(一)

    JUnit单元测试框架(白盒测试) 1、下载 JUnit的jar包 jar包地址(junit4.10) 2、Bui...

网友评论

    本文标题:JaveEE测试:第二步-JUNIT自定义

    本文链接:https://www.haomeiwen.com/subject/lxmfjttx.html