ソフト アサーションが何なのかわからない場合は、「ソフト アサーション – 単体テストと統合テストにソフト アサーションを使用する必要がある理由」をお読みください。
この記事は、Assert J を使用してカスタム アサーションを作成する方法を説明する「Assert with Grace: Custom Assertions for Cleaner Code」の続きです。ここでは、そのアプローチを拡張して、カスタム アサーションに加えてソフト アサーション アプローチを使用する方法を学びます。
AssertJ の Assertions クラスまたはカスタム クラスを使用して、ハード アサーションを作成できます。ソフト アサーションの利点をすべて得るには、次のことを行う必要があります。
カスタム アサーションの作成方法については、「猶予付きアサート: よりクリーンなコードのためのカスタム アサーション」の記事で学習しました。次のようになります:
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 を作成します。手順は次のとおりです:
手順は複雑に見えますが、実際には次のようになります。
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 プロジェクトにあります。ここでは、次の内容を確認できます。
以上が猶予付きアサート: AssertJ を使用したよりクリーンなコードのためのカスタム ソフト アサーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。