JaveEEテスト:ステップ2-JUNITカスタム

5219 ワード

カスタムローダ


我々のテストベースクラスではSpring-testが提供するローダを使用しています
@RunWith(SpringJUnit4ClassRunner.class)  

上記の効果を達成するには、独自のローダをカスタマイズする必要があります.
public class MyJUnit4ClassRunner extends SpringJUnit4ClassRunner{
    public MyJUnit4ClassRunner(Class> clazz) throws InitializationError {
        super(clazz);
    }
}

SpringJUnit 4 ClassRunnerのソースコードを見て、彼は私たちのローダーをどのように書くべきか教えてくれました.次は私たちが書いたローダーです
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 {
    }  

}


Listenerの使用


前述のBaseJunit 4 Testクラスの変更
@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の使い方を紹介します