春アサートステートメント

Spring Assertステートメント

1. 概要

このチュートリアルでは、Spring Assertクラスの目的に焦点を当てて説明し、その使用方法を示します。

2. Assertクラスの目的

SpringAssertクラスは、引数の検証に役立ちます。 By using methods of the Assert class, we can write assumptions which we expect to be true.そして、それらが満たされない場合、実行時例外がスローされます。

Assertのメソッドは、Javaのassertステートメントと比較できます。 Javaassertステートメントは、条件が失敗した場合、実行時にErrorをスローします。 興味深い事実は、これらのアサーションを無効にできることです。

SpringAssertのメソッドのいくつかの特徴は次のとおりです。

  • Assertのメソッドは静的です

  • IllegalArgumentExceptionまたはIllegalStateExceptionのいずれかをスローします

  • 通常、最初のパラメーターは検証の引数またはチェックする論理条件です。

  • 最後のパラメーターは通常、検証が失敗した場合に表示される例外メッセージです

  • メッセージは、StringパラメータまたはSupplier<String> パラメータとして渡すことができます

また、同じような名前にもかかわらず、SpringアサーションはJUnitや他のテストフレームワークのアサーションと何の共通点もないことにも注意してください。 Springアサーションはテスト用ではなく、デバッグ用です。

3. 使用例

パブリックメソッドdrive()を使用してCarクラスを定義しましょう。

public class Car {
    private String state = "stop";

    public void drive(int speed) {
        Assert.isTrue(speed > 0, "speed must be positive");
        this.state = "drive";
        // ...
    }
}

速度が正数でなければならないことがわかります。 上記の行は、条件を確認し、条件が失敗した場合に例外をスローする簡単な方法です。

if (!(speed > 0)) {
    throw new IllegalArgumentException("speed must be positive");
}

Assertのパブリックメソッドには、おおよそこのコードが含まれています。これは、アプリケーションが回復することを期待されていない実行時例外を伴う条件付きブロックです。

負の引数を指定してdrive()メソッドを呼び出そうとすると、IllegalArgumentException例外がスローされます。

Exception in thread "main" java.lang.IllegalArgumentException: speed must be positive

4. 論理アサーション

4.1. isTrue()

この主張は上記で議論されました。 boolean条件を受け入れ、条件がfalseの場合はIllegalArgumentExceptionをスローします。

4.2. 状態()

state()メソッドはisTrue()と同じ署名を持ちますが、IllegalStateException.をスローします

名前が示すように、オブジェクトの不正な状態のためにメソッドを継続してはならない場合に使用する必要があります。

車が走っている場合、fuel()メソッドを呼び出すことができないと想像してください。 この場合、state()アサーションを使用しましょう。

public void fuel() {
    Assert.state(this.state.equals("stop"), "car must be stopped");
    // ...
}

もちろん、論理アサーションを使用してすべてを検証できます。 しかし、読みやすくするために、コードをより表現力豊かにする追加のアサーションを使用できます。

5. Object and Type Assertions

5.1. notNull()

notNull()メソッドを使用すると、オブジェクトはnullではないと見なすことができます。

public void сhangeOil(String oil) {
    Assert.notNull(oil, "oil mustn't be null");
    // ...
}

5.2. isNull()

一方、isNull()メソッドを使用して、オブジェクトがnullであるかどうかを確認できます。

public void replaceBattery(CarBattery carBattery) {
    Assert.isNull(
      carBattery.getCharge(),
      "to replace battery the charge must be null");
    // ...
}

5.3. isInstanceOf()

オブジェクトが特定のタイプの別のオブジェクトのインスタンスであるかどうかを確認するには、isInstanceOf()メソッドを使用できます。

public void сhangeEngine(Engine engine) {
    Assert.isInstanceOf(ToyotaEngine.class, engine);
    // ...
}

この例では、ToyotaEngineEngine.のサブクラスであるため、チェックは正常に合格します。

5.4. isAssignable()

タイプを確認するには、Assert.isAssignable()を使用できます。

public void repairEngine(Engine engine) {
    Assert.isAssignable(Engine.class, ToyotaEngine.class);
    // ...
}

最近の2つのアサーションは、is-aの関係を表しています。

6. テキストアサーション

テキストアサーションは、String引数のチェックを実行するために使用されます。

6.1. hasLength()

hasLength()メソッドを使用して、Stringが空白でないかどうか、つまり少なくとも1つの空白が含まれているかどうかを確認できます。

public void startWithHasLength(String key) {
    Assert.hasLength(key, "key must not be null and must not the empty");
    // ...
}

6.2. hasText()

hasText()メソッドを使用して、条件を強化し、Stringに少なくとも1つの非空白文字が含まれているかどうかを確認できます。

public void startWithHasText(String key) {
    Assert.hasText(
      key,
      "key must not be null and must contain at least one non-whitespace  character");
    // ...
}

6.3. doesNotContain()

doesNotContain()メソッドを使用して、String引数に特定の部分文字列が含まれていないかどうかを判断できます。

public void startWithNotContain(String key) {
    Assert.doesNotContain(key, "123", "key mustn't contain 123");
    // ...
}

7. コレクションおよびマップアサーション

7.1. コレクションのnotEmpty()

名前が示すように、notEmpty()メソッドは、コレクションが空ではないことを表明します。つまり、コレクションはnullではなく、少なくとも1つの要素が含まれています。

public void repair(Collection repairParts) {
    Assert.notEmpty(
      repairParts,
      "collection of repairParts mustn't be empty");
    // ...
}

7.2. マップのnotEmpty()

同じメソッドがマップに対してオーバーロードされ、マップが空ではなく、少なくとも1つのエントリが含まれているかどうかを確認できます。

public void repair(Map repairParts) {
    Assert.notEmpty(
      repairParts,
      "map of repairParts mustn't be empty");
    // ...
}

8. 配列表明

8.1. 配列のnotEmpty()

最後に、notEmpty()メソッドを使用して、配列が空ではなく、少なくとも1つの要素が含まれているかどうかを確認できます。

public void repair(String[] repairParts) {
    Assert.notEmpty(
      repairParts,
      "array of repairParts mustn't be empty");
    // ...
}

8.2. noNullElements()

noNullElements()メソッドを使用して、配列にnull要素が含まれていないことを確認できます。

public void repairWithNoNull(String[] repairParts) {
    Assert.noNullElements(
      repairParts,
      "array of repairParts mustn't contain null elements");
    // ...
}

配列にnull要素がない限り、配列が空の場合でもこのチェックに合格することに注意してください。

9. 結論

この記事では、Assertクラスについて説明しました。 このクラスはSpringフレームワーク内で広く使用されていますが、それを利用してより堅牢で表現力豊かなコードを簡単に書くことができます。

いつものように、この記事の完全なコードはGitHub projectにあります。