CLOVER🍀

That was when it all began.

AssertJを使って、テストコードを書く

以前書いたエントリ、

Fest Assertionsを使って、テストコードを書く
http://d.hatena.ne.jp/Kazuhira/20131224/1387895002

をAssertJで書き直した、焼き直しみたいなエントリです。

以前、Fest Assertionsを使ってから、個人的に書くテストコードにはFest Assertionsを使っていたのですが、開発が停止状態?にあることと、その後継的なものとしてAssertJがあることに気付いてはいたのですが、長らく放ったらかしにしていました…。

いい加減、試してみようかということで。

AssertJ
http://joel-costigliola.github.io/assertj/

Fest Assertionsと同様、JUnitおよびTestNGと一緒に使えるみたいです。

また、Fest Assertionsからのマイグレーションガイドもあるようです。

Migrating from Fest 2.x/Migrating from Fest 1.4
http://joel-costigliola.github.io/assertj/assertj-core-migrating-from-fest.html

個人的には、Festに比べてちゃんとJavadocがあるところがいいなーと思います。

http://joel-costigliola.github.io/assertj/core/api/index.html

では、チュートリアル

One minute starting guide
http://joel-costigliola.github.io/assertj/assertj-core-quick-start.html

を見つつ、以前Fest Assertionsで書いたエントリをAssertJを使って書き直してみたいと思います。

まずは、依存関係の定義。

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <version>1.6.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

今回は、JUnitと一緒に使用します。

スケープゴートはCommons Lang3で。

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.3.2</version>
      <scope>compile</scope>
    </dependency>

で、AssertJを使って書いたコード。
src/test/java/org/littlewings/assertj/example/CommonsLangAssertJTest.java

package org.littlewings.assertj.example;

import static org.assertj.core.api.Assertions.*;

import org.apache.commons.lang3.StringUtils;

import org.junit.Test;

public class CommonsLangAssertJTest {
    @Test
    public void testSimple() {
        assertThat(StringUtils.join("Hello", " ", "World"))
            .isEqualTo("Hello World");

        assertThat("AssertJ TestCase.")
            .startsWith("AssertJ");
    }
}

AssertJのAPIは、以下のstatic importで呼び込んでいます。

import static org.assertj.core.api.Assertions.*;

チュートリアルにも書いていますが、ワイルドカードではなくて必要な個々のメソッドを読んでもいいみたいです。

他にも例を。
src/test/java/org/littlewings/assertj/example/AssertJSimpleTest.java

package org.littlewings.assertj.example;

import static org.assertj.core.api.Assertions.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class AssertJSimpleTest {
    @Test
    public void testString() {
        assertThat("Hello" + ", " + "World")
            .isEqualTo("Hello, World");

        assertThat("").isNullOrEmpty();
        assertThat((String) null).isNullOrEmpty();

        assertThat("Java").hasSize(4);

        assertThat("The quick brown fox jumps over the lazy dog")
            .contains("fox");
    }

    @Test
    public void testInt() {
        assertThat(1 + 3).isEqualTo(4);
        assertThat(5 * 5).isLessThan(30);
        assertThat(5 * 5).isGreaterThan(20);
    }

    @Test
    public void testList() {
        assertThat(new ArrayList<Object>()).isNullOrEmpty();
        assertThat(new ArrayList<Object>()).isEmpty();

        assertThat(Arrays.asList("Hello", ", ", "World"))
            .hasSize(3);
        assertThat(Arrays.asList("Hello", ", ", "World"))
            .contains("World");
        assertThat(Arrays.asList("Hello", ", ", "World"))
            .containsOnly(", ", "Hello", "World");
        assertThat(Arrays.asList("Hello", ", ", "World"))
            .containsSequence("Hello", ", ", "World");
    }
}

import文を変えたくらいで(あと、メソッド名も変えましたが…)、Fest Assertionsで書いていたコードをそのまま貼っても動作しました。

個人的には、Fest Assertionsの代わりに使っていってみようかなーと。