UTFluteのセットアップ

DBFluteプロジェクトが提供するライブラリ UTFlute のセットアップのページ。

JUnit の jar は 3 でも 4 でも

UTFlute は、JUnit3 方式を採用しています。

ですが、利用する Junit のバージョンは 3 でも 4 でもどちらでも構いません。 (JUnit4 でも、JUnit3 の TestCase クラスが同梱されているので)

dependencyの設定 (DI利用想定)

Maven の pom.xml に、利用するDIコンテナに対応する UTFlute を指定します。

DBFlute-1.1.x対応のDependency

e.g. LastaFluteを使っている場合の UTFlute の dependency 設定 @pom.xml
    <dependency>
      <groupId>org.dbflute.utflute</groupId>
      <artifactId>utflute-lastaflute</artifactId>
      <version>0.9.2</version>
      <scope>test</scope>
    </dependency>
e.g. Springを使っている場合の UTFlute の dependency 設定 @pom.xml
    <dependency>
      <groupId>org.dbflute.utflute</groupId>
      <artifactId>utflute-spring</artifactId>
      <version>0.9.2</version>
      <scope>test</scope>
    </dependency>
e.g. Guiceを使っている場合の UTFlute の dependency 設定 @pom.xml
    <dependency>
      <groupId>org.dbflute.utflute</groupId>
      <artifactId>utflute-guice</artifactId>
      <version>0.9.2</version>
      <scope>test</scope>
    </dependency>
e.g. Seasarを使っている場合の UTFlute の dependency 設定 @pom.xml
    <dependency>
      <groupId>org.dbflute.utflute</groupId>
      <artifactId>utflute-seasar</artifactId>
      <version>0.9.2</version>
      <scope>test</scope>
    </dependency>

Maven の repository は、DBFlute Runtime と同じです。

web対応のDependency

さらに、HttpServlet の Mock を利用したい場合は、Spring と Guice に関しては "-web" を付けます。 (Seasarは、そもそも Servlet への依存を持っていて、"-web" なしでも Mock が利用できます)

e.g. Springと Web Mock の UTFlute の dependency 設定 @pom.xml
    <dependency>
      <groupId>org.dbflute.utflute</groupId>
      <artifactId>utflute-spring-web</artifactId>
      <version>0.9.2</version>
      <scope>test</scope>
    </dependency>
e.g. Guiceと Web Mock の UTFlute の dependency 設定 @pom.xml
    <dependency>
      <groupId>org.dbflute.utflute</groupId>
      <artifactId>utflute-guice-web</artifactId>
      <version>0.9.2</version>
      <scope>test</scope>
    </dependency>

DIコンテナを使わず、UTFluteをPlainに使うのであれば、utflute-coreを指定します。

実装環境の準備 (DI利用想定)

スーパークラスの作成と継承

[Web]ContainerTestCase というクラスが用意されています。DIコンテナを利用するテストケースでは、このクラスを継承します。 (webに依存したプロジェクトであれば、クラス名に Web が付いた方を)

こうすることで、テストケース起動時にDIコンテナが起動して、inject()が利用できるようになります。(後述のDI設定が必要です)

そのプロジェクト独自に、設定や挙動を変更するために、ContainerTestCaseを継承したプロジェクト独自のスーパークラスを用意することが推奨されます。 例えば、UnitContainerTestCase, Unit[プロジェクト名]TestCase というような名前が慣習です。

e.g. 独自のスーパークラスを作成、WebContainerTestCaseを継承 @Java
public abstract class UnitContainerTestCase extends WebContainerTestCase {

    // もし、プロジェクト独自に設定などを調整する場合はここでオーバーライドするなど
}
e.g. UnitContainerTestCaseを継承してDIを利用できるように @Java
public class FooActionTest extends UnitContainerTestCase {

    public void test_index_basic() {
        // ## Arrange ##
        FooAction action = new FooAction();
        inject(action); // 起動したDIコンテナを利用してDIする

        // ## Act ##
        action.index();
        ...
    }
}

DIコンテナを利用しないテストケースでは、PlainTestCase というスーパークラスが用意されています。UTFluteの便利なメソッドが利用できるようになります。 (ContainerTestCaseも、これを継承しています)

e.g. 独自のスーパークラスを継承してテストケースを書く @Java
public class FooActionTest extends PlainTestCase {

    public void test_index_basic() {
        cannonball(...); // マルチスレッドのテストなど
    }
}

SpringのDI設定

Springにおいては、デフォルトで beanRefContext.xml を読み込みますが、SpringBootなどの環境であれば、 provideDefaultApplicationContext() をオーバーライドして、アプリの JavaConfig を読み込むと良いでしょう。

e.g. 独自のスーパークラスでDI設定を変える (Spring) @Java
/**
 * The test case with container for unit test.
 * @author jflute
 */
public abstract class UnitContainerTestCase extends ContainerTestCase {

    // ===================================================================================
    //                                                                            Settings
    //                                                                            ========
    @Override
    protected ApplicationContext provideDefaultApplicationContext() {
        List<Class<?>> configList = DfCollectionUtil.newArrayList();
        configList.add(JdbcBeansJavaConfig.class);
        configList.add(DBFluteBeansJavaConfig.class);
        readyConfigs(configList);
        return new AnnotationConfigApplicationContext(configList.toArray(new Class<?>[] {}));
    }

    /**
     * Ready configurations of your unit test. <br>
     * You can add your own configurations. <br>
     * (several configurations are already registered as default)
     * @param configList The list of java configuration type for Spring Framework. (NotNull, Mutable)
     */
    protected void readyConfigs(List<Class<?>> configList) { // you can override
    }
}

UTFluteは、DIコンテナ起動時はデータベースとトランザクションを利用することが前提です。 読み込んだ XML にて、javax.sql.DataSource と (Springの) PlatformTransactionManager がDIできる必要があります。

dbflute-example-on-springboot が参考になります。

GuiceのDI設定

Guiceにおいては、デフォルトでは何も読み込みません。

prepareModuleList() メソッドをオーバーライドして、UTFlute に Module をプッシュします。

e.g. 独自のスーパークラスでDI設定を指定する (Guice) @Java
public abstract class UnitContainerTestCase extends ContainerTestCase {

    @Override
    protected List<Module> prepareModuleList() {
        DataSource dataSource = createDataSource();
        List<Module> moduleList = new ArrayList<Module>();
        moduleList.add(new DBFluteModule(dataSource));
        moduleList.add(createTransactionModule(dataSource));
        return moduleList;
    }

    ...
}

UTFluteは、DIコンテナ起動時はデータベースとトランザクションを利用することが前提です。 読み込んだ Module にて、javax.sql.DataSource と TransactionManager がDIできる必要があります。

dbflute-guice-example が参考になります。

SeasarのDI設定

UTFluteは、DIコンテナを起動してテストケースを実行することをメインにしたツールですので、DIコンテナを起動する必要があります。

Seasarにおいては、デフォルトで app.dicon を読み込みます。

もし、テスト用の dicon を利用したい場合は、prepareConfigFile() メソッドをオーバーライドして、UTFluteが読み込むDIファイルを差し替えることができます。

e.g. 独自のスーパークラスでDI設定を変える (Seasar) @Java
public abstract class UnitContainerTestCase extends ContainerTestCase {

    @Override
    protected String prepareConfigFile() {
        return "test_app.dicon"; // テスト用のdiconを読み込むように変更
    }
}

UTFluteは、DIコンテナ起動時はデータベースとトランザクションを利用することが前提です。 読み込んだ dicon ファイルにて、javax.sql.DataSource と javax.transaction.TransactionManager がDIできる必要があります。 つまり、jdbc.diconが読み込まれていればOKです。

dbflute-seasar-example が参考になります。

Plainに使うなら (DIコンテナ利用なし)

DIコンテナは使わないプロジェクトで、UTFluteを単なるテスト支援ツールとして利用するのであれば、utflute-coreを指定します。

e.g. plainな使い方をするときの UTFlute の dependency 設定 @pom.xml
    <dependency>
      <groupId>org.dbflute.utflute</groupId>
      <artifactId>utflute-core</artifactId>
      <version>0.9.2</version>
    </dependency>

そして、PlainTestCase を継承してテストケースを作成します。

DIコンテナやトランザクション処理に依存していない、markHere() や cannonball(), projectA(), policeStoryOf...() などの機能が利用できます。

e.g. PlainTestCaseを継承して、plainな機能を使う @Java
public class FooTest extends PlainTestCase {

    public void test_demo() { // メソッド名が test で始まること
        markHere("called");
        assertMarked("called");
        
        cannonball(...);
        policeStoryOf...(...);
        ...
    }
}

そもそも、DIコンテナ利用の ContainerTestCase は、この PlainTestCase を継承しています。