0

JUnit テストはアサーションを返すオブジェクトから解決できますか?

たとえば、次のようなテストがある場合、これは機能しますか?

@Test
public void testCase1() {
    TestObject to = new TestObject();
    to.login();
    to.runTest();
    // then assert success
    to.verifyTest();

}

public Class TestObject() {
  ....
  public Assert verifyTest() {
    return assertTrue("Test result not found.", this.validateTestResult() );
  }
}
4

1 に答える 1

1

ほとんどの Assert 呼び出しはAssertionError、失敗すると をスローするため、コードは記述どおりには見えませんが、コードを少し調整してコンパイル/実行することができます。これらは例外として実装されるため、Assert メソッドはどこからでも呼び出すことができます。これには、テストを簡単に実行できるように設定したヘルパー クラスも含まれ、スタックの奥深くまで好きなだけ呼び出すことができます。

編集:多くのオブジェクトに対して同様のアサーションのセットを作成する必要がある場合は、ヘルパー クラスを設定することを強くお勧めします。私は誤解して、あなたTestObjectがテスト対象のシステムだと思っていました。残りは代わりにその状況に適用されます。

==

テスト対象のクラス内からメソッドを呼び出すことを妨げるものは何もありませんがAssert、JUnit の意図の一部は、コード クラスとは別のクリーンなテスト クラスを用意することです。そうすれば、テストは個別に進化でき、多くの場合、クラスのインターフェースが変更されない限り変更する必要さえありません。私のコードでは、それらを別の「ソースフォルダー」の同じパッケージに入れているので、次のようになります。

  • src/com/mypackage/project1/データベース/DatabaseAccessor.java
  • testsrc/com/mypackage/project1/database/DatabaseAccessorTest.java
  • testsrc/com/mypackage/project1/database/DatabaseAccessorSystemTest.java

このように物事を分離する理由の 1 つは、本番環境でテスト コードが実行されないようにするためです。メソッドが同じクラス内にある場合verifyTest、クラス内でメソッドを呼び出すことを止めるものは何もありません。さらに悪いことに、コードベースの他の場所から他のクラスから呼び出すこともできません。また、製品コードの junit.jar に依存することも避けます。

一貫性のない状態や不正な引数を回避するために製品コードでアサーションを作成しようとしている場合、それは別の問題であり、JUnit のAssertクラスを避ける必要がありassertます。 javac)。代わりに、Guava のPreconditions.

于 2012-10-06T03:32:04.897 に答える