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 を継承しています。