6.1 アサート

アサートは、コード内のさまざまな場所に挿入できる特別なチェックです。彼らの仕事は、何かが間違っていたことを判断することです。というか、すべてが順調に進んでいることを確認するためです。これは「必要に応じて」であり、さまざまな方法で設定できます。

上記のコードではすでにいくつかのアサーションが発生しています。1 つ目は、オブジェクトが等しいかどうかをチェックすることです。オブジェクトが等しくない場合、例外がスローされ、テストは失敗します。

最終レポートの JUnit は「値 1 を受け取りましたが、3 が期待されていました」のような内容を書き込むため、ここでは比較の順序が重要です。このようなチェックの一般的な形式は次のとおりです。

assertEquals(standard , meaning)

例:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 メソッドassertEquals、assertTrue、assertFalse

以下に、最も一般的なメソッドであるアサーションをリストします。それらの名前から、それらがどのように機能するかを推測することはかなり可能です。しかし、とにかく短い説明を書きます。

アサートイコール 2 つのオブジェクトが等しいことを確認します
アサート配列等しい 2 つの配列に等しい値が含まれているかどうかを確認します
アサートノットヌル 引数がnullでないかどうかを確認します
アサートNULL 引数がnullかどうかを確認します
アサート違う 2 つの引数が同じオブジェクトではないことを確認します
アサート同じ 2 つの引数が同じオブジェクトであることを確認します
アサート真 引数がtrueかどうかを確認します
アサートFalse 引数がfalseかどうかを確認します

これらのメソッドの中には、冗長に見えるものもあります。単純にassertTrue(a == b)と書けるのに、なぜassertSame(a, b)を使うのでしょうか?

重要なのは、assert は非常に賢いメソッドであるということです。エラー情報をログに書き込むなど、多くの便利な機能を実行します。最初のケースでは、オブジェクト A が予期されていたが、オブジェクト B が受信されたと書き込みます。2 番目のケースでは、単純にtrueが予期されたと書き込みます。

何百ものテストがある場合、特に専用のテスト サーバーで実行されているテストの場合、詳細なログがあると非常に役立ちます。私の言っている意味が分かると思います。

配列の比較例:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3assertAllメソッド

前述したように、assertメソッドはチェックを実行するだけでなく、比較可能なオブジェクトに関する多くの情報をログに書き込みます。

比較してみましょう:

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

ただし、パラメータの 1 つが一致しない場合、残りはチェックされません。しかし、私はそれらが引き続き発生し、その結果がログに記録されることを望みます。しかし同時に、少なくとも 1 つのチェックが失敗した場合、テストは失敗したことになります。

これには特別なメソッド、assertAll()があります。最初の引数として、ログに書き込まれるコメントを受け取り、その後、任意の数のアサート関数を受け取ります。

これを使用して例を書き直すと次のようになります。

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

アドレスが間違っている場合は、次のような内容がログに書き込まれます。

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4assertTimeoutメソッド

@Timeoutアノテーションを覚えていますか? これにより、メソッド全体の実行時間を制御できるようになりました。ただし、メソッド内のコードの一部の実行に制限を設定すると便利な場合があります。これにはassertTimeout()を使用できます。

最初のパラメータとして時刻が渡され、2 番目のパラメータとして指定された時間内に実行する必要があるコード (関数) が渡されます。例:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

Assertクラスには、assertTimeout()メソッドの 12 のバリアントがあります。それらについてさらに詳しく知りたい場合は、公式ドキュメントへようこそ。

6.5assertThrowsメソッド

特定の状況でコードが適切な例外をスローすること、つまりエラーを検出して適切な例外をスローすることを確認する必要がある状況がよくあります。これは非常に一般的な状況です。

この場合、別の便利なアサートメソッドがあります。これは、 assertThrows()です。その呼び出しの一般的な形式は次のとおりです。

assertThrows(exception , code)

基本的に、これはassertTimeout()メソッドと非常に似ていますが、指定されたコードが適切な例外をスローするかどうかをチェックするだけです。例:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}