🍟

Android(kotlin)でThrowをassertしたい

2022/01/14に公開

ルー大柴みたいなタイトルですが、Androidで例外処理のアサーションチェックをしたいということです。
少し躓いたので、やり方を共有したいと思います。

色々なやり方があるらしい

try-catchを使ったやり方などもありますが、多く出てきたのは以下のやり方です[1][2]
以下のコードはcodechacha.com[1:1]から引用しています。

@Rule
public ExpectedException exceptionRule = ExpectedException.none();

@Test
public void testExceptionThrown() {
    exceptionRule.expect(NullPointerException.class);

    String str = null;
    str.contains("a");
}

このように、ExpectedException.none()を使ったやり方です。
しかし、これは現在非推奨になっています

他の方法としてassertThrowsを使う方法があります。
この記事[3]のコードをkotlinに書き換えて使いたいと思います。

    @Test
    fun assertTest() {
        val e: java.lang.IllegalArgumentException = assertThrows(
            IllegalArgumentException::class.java
        ) {
            throw IllegalArgumentException("aa")
        }
    }

これで、例外の種類 をassertすることが出来ました。試しにthrow IllegalArgumentException("aa")throw NullPointerException("aa")と書き換えるとテストが通らなくなります。
また、例外のメッセージを検証したいというニーズがあると思います。その時はassertEquals(e.message, "aa")を以下のように追加すればOKです。

    @Test
    fun assertTest() {
        val e: java.lang.IllegalArgumentException = assertThrows(
            IllegalArgumentException::class.java
        ) {
            throw IllegalArgumentException("aa")
        }
        assertEquals(e.message, "aa")
    }
脚注
  1. JUnitのExceptionテスト / codechacha.com https://codechacha.com/ja/assert-exception-thrown/ (2022-01-14閲覧) ↩︎ ↩︎

  2. assert - java 例外 発生させる テスト - JUnit 4 のテストで特定の例外がスローされることをアサートするには? / https://lycaeum.dev/ja/questions/156503 (2022-01-14閲覧) ↩︎

  3. JUnit5(Alpha版)使い方メモ / @opengl-8080 on Qiita https://qiita.com/opengl-8080/items/40a922bfdd2709aaea1f (2022-01-14閲覧) ↩︎

Discussion