猶予付きアサート: AssertJ を使用したよりクリーンなコードのためのカスタム ソフト アサーション

Mary-Kate Olsen
リリース: 2024-11-23 09:11:35
オリジナル
451 人が閲覧しました

Assert with Grace: Custom Soft Assertions using AssertJ for Cleaner Code

導入

ソフト アサーションが何なのかわからない場合は、「ソフト アサーション – 単体テストと統合テストにソフト アサーションを使用する必要がある理由」をお読みください。

この記事は、Assert J を使用してカスタム アサーションを作成する方法を説明する「Assert with Grace: Custom Assertions for Cleaner Code」の続きです。ここでは、そのアプローチを拡張して、カスタム アサーションに加えてソフト アサーション アプローチを使用する方法を学びます。

AssertJ を使用したカスタム ソフト アサーション

AssertJ の Assertions クラスまたはカスタム クラスを使用して、ハード アサーションを作成できます。ソフト アサーションの利点をすべて得るには、次のことを行う必要があります。

  • カスタム アサーションを実装する
  • カスタム ソフト アサーション クラスを作成し、AssertJ から AbstractSoftAssertion を拡張します

カスタム アサーション

カスタム アサーションの作成方法については、「猶予付きアサート: よりクリーンなコードのためのカスタム アサーション」の記事で学習しました。次のようになります:

public class SimulationAssert extends AbstractAssert<SimulationAssert, Simulation> {
    protected SimulationAssert(Simulation actual) {
        super(actual, SimulationAssert.class);
    }
    public static SimulationAssert assertThat(Simulation actual) {
        return new SimulationAssert(actual);
    }
    public SimulationAssert hasValidInstallments() {
        isNotNull();
        if (actual.getInstallments() < 2 || actual.getInstallments() >= 48) {
            failWithMessage("Installments must be must be equal or greater than 2 and equal or less than 48");
        }
        return this;
    }
    public SimulationAssert hasValidAmount() {
        isNotNull();
        var minimum = new BigDecimal("1.000");
        var maximum = new BigDecimal("40.000");
        if (actual.getAmount().compareTo(minimum) < 0 || actual.getAmount().compareTo(maximum) > 0) {
            failWithMessage("Amount must be equal or greater than $ 1.000 or equal or less than than $ 40.000");
        }
        return this;
    }
}
ログイン後にコピー
ログイン後にコピー

カスタム アサーションを使用すると、テストでの読みやすさが向上するだけでなく、有効な値をテストする責任がカスタム アサーションに送信されます。

class SimulationsCustomAssertionTest {
    @Test
    void simulationErrorAssertion() {
        var simulation = Simulation.builder().name("John").cpf("9582728395").email("john@gmail.com")
                .amount(new BigDecimal("1.500")).installments(5).insurance(false).build();
        SimulationAssert.assertThat(simulation).hasValidInstallments();
        SimulationAssert.assertThat(simulation).hasValidAmount();
    }
}
ログイン後にコピー
ログイン後にコピー

カスタム アサーションを用意したら、カスタム ソフト アサーションを実装します。

カスタム ソフト アサーションを作成する

カスタム ソフト アサーションを作成する簡単なプロセスがあり、前提条件としてカスタム アサーションを実装する必要があります。前の記事を考慮すると、カスタム アサーションとして SimulationAssert クラスがあり、カスタム ソフト アサーションとして SimulationSoftAssert を作成します。手順は次のとおりです:

  1. AbstractSoftAssertions クラスを拡張します
  2. 次のコマンドを使用して、assertThat() メソッドを作成します。
    • メソッドはカスタム アサーション クラスとしてオブジェクトを返します
    • アサーションの主題へのパラメータ
    • メソッドは、パラメータがカスタム アサーション クラスとアサーションのサブジェクトであるメソッド プロキシを返します
  3. 次のコマンドを使用して、assertSoftly() メソッドを作成します。
    • カスタム ソフト アサート クラスのコンシューマとしてのパラメータ
    • パラメータがカスタム ソフト アサーション クラスとメソッド パラメータであるため、SoftAssertionsProvider.assertSoftly() メソッドを使用します

手順は複雑に見えますが、実際には次のようになります。

public class SimulationSoftAssert extends AbstractSoftAssertions {
    public SimulationAssert assertThat(Simulation actual) {
        return proxy(SimulationAssert.class, Simulation.class, actual);
    }
    public static void assertSoftly(Consumer<SimulationSoftAssert> softly) {
        SoftAssertionsProvider.assertSoftly(SimulationSoftAssert.class, softly);
    }
}
ログイン後にコピー

カスタム ソフト アサーションの使用

AssertJ SoftAssertion クラスはソフト アサーションを担当します。これは、シミュレーション コンテキストに適用できる例です:

AssertJ SoftAssertion クラスはソフト アサーションを担当します。これは、シミュレーション コンテキストに適用できる例です:

public class SimulationAssert extends AbstractAssert<SimulationAssert, Simulation> {
    protected SimulationAssert(Simulation actual) {
        super(actual, SimulationAssert.class);
    }
    public static SimulationAssert assertThat(Simulation actual) {
        return new SimulationAssert(actual);
    }
    public SimulationAssert hasValidInstallments() {
        isNotNull();
        if (actual.getInstallments() < 2 || actual.getInstallments() >= 48) {
            failWithMessage("Installments must be must be equal or greater than 2 and equal or less than 48");
        }
        return this;
    }
    public SimulationAssert hasValidAmount() {
        isNotNull();
        var minimum = new BigDecimal("1.000");
        var maximum = new BigDecimal("40.000");
        if (actual.getAmount().compareTo(minimum) < 0 || actual.getAmount().compareTo(maximum) > 0) {
            failWithMessage("Amount must be equal or greater than $ 1.000 or equal or less than than $ 40.000");
        }
        return this;
    }
}
ログイン後にコピー
ログイン後にコピー

これを使用する場合の「問題」は、作成したカスタム アサーションを使用できないことです。上記の例では、SoftAssertions クラスはカスタム アサーションにアクセスできないため、isEqualTo() を使用して分割払いと金額のアサーションを確認できます。

カスタム ソフト アサーション クラスを作成することで、この問題を解決しました。したがって、SoftAssertions クラスを使用する代わりに、カスタム クラス SimulationSoftAssert.
を使用します。

class SimulationsCustomAssertionTest {
    @Test
    void simulationErrorAssertion() {
        var simulation = Simulation.builder().name("John").cpf("9582728395").email("john@gmail.com")
                .amount(new BigDecimal("1.500")).installments(5).insurance(false).build();
        SimulationAssert.assertThat(simulation).hasValidInstallments();
        SimulationAssert.assertThat(simulation).hasValidAmount();
    }
}
ログイン後にコピー
ログイン後にコピー

SimulationSoftAssert.assertSoftly() は、アサーション中のエラーやその他のアクティビティを管理できるようにすべての内部メソッドを呼び出すソフト アサーションのプロバイダーです。使用中のassertThat()は、assertSoftly()内で、ソフト・アサートとアサーションのサブジェクトの間のproxy()によってカスタム・アサーションにアクセスできるカスタムのものになります。

このアプローチを使用すると、カスタム アサーションを実装することにより、ソフト アサーションでカスタム アサーションを利用できるようになります。

終わり

以上です!

完全に実装され、実際に動作する例は、credit-api プロジェクトにあります。ここでは、次の内容を確認できます。

  • SimulationAssert クラス
  • SimulationsCustomAssertionTest クラスでのテストの使用法

以上が猶予付きアサート: AssertJ を使用したよりクリーンなコードのためのカスタム ソフト アサーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート