1

JUnit ルールを使用して、失敗したテストをすぐに再実行しています。私の追加の要件は、再実行も失敗した場合、同じ理由で失敗したかどうかを判断することです。

これを行うために、この回答のコードを適応させて、失敗の記録を保持し、それらを比較しました。ただし、比較 (.equals) は、同じ理由で失敗したにもかかわらず、常に false と評価されます。これについて最善の方法は何ですか?

  private Statement statement(final Statement base, final Description description) {
    return new Statement() {
      @Override
      public void evaluate() throws Throwable {

        for (int i = 0; i < retryCount; i++) {
          try {
            base.evaluate();
            return;
          } catch (Throwable t) {
            System.err.println(description.getDisplayName() + ": run " + (i + 1) + " failed");

            // Compare this error with the one before it.
            if (errors.size() > 0) {
              if (t.equals(errors.get(errors.size() - 1))) {
                System.out.println("The error is the same as the previous one!");
              } else {
                System.out.println("The error is different from the previous one.");
              }
            }

            errors.add(t);
          }
        }
        System.err.println(description.getDisplayName() + ": giving up after " + retryCount
            + " failures");

        // Throw most recent error.
        throw errors.get(errors.size() - 1);
      }
    };
  }
4

4 に答える 4

3

instance ofが任意のクラスの型であるかどうかのみを知りたい場合は、次のように使用します。

if( t instanceof Throwable){
   //... 
}
于 2015-05-15T13:44:54.930 に答える
2

aの同等性Throwableは「同じThrowable」と定義されます。(参考文献を比較します。)


「同じ理由」は、アプリケーションについて考えて定義する必要があるものです。

それを定義できる1つの方法は、「同じタイプで大まかに同じthrowステートメント」です。

static boolean sameTypeAndLine(Throwable t1, Throwable t2) {
    if (t1.getClass() == t2.getClass()) {
        StackTraceElement[] trace1 = t1.getStackTrace();
        StackTraceElement[] trace2 = t2.getStackTrace();
        return trace1[0].equals(trace2[0]);
    } else {
        return false;
    }
}

しかし、それにはまだあいまいさがあります。

  • if (bad1 || bad2) {
        // same throw site, different conditions
        throw new Exception(...);
    }
    
  • // throws NullPointerExeption
    // (was it foo or the result of bar() that was null?)
    Object baz = foo.bar().baz();
    

したがって、あなたができる最善のことは、例外の理由を明確に定義することです。

class MyException {
    final Reason reason;

    MyException(Reason reason) {
        this.reason = reason;
    }

    // or a class, or whatever you need
    enum Reason {A, B, C}
}

そして、それらに対してチェックします。さらに、あいまいさを防ぐコーディング スタイルを使用します。

于 2015-05-15T13:57:37.347 に答える
1

比較できるのは次の場合のみです。

名前で

t.getClass().getName()

またはインスタンスによって

t instanceof XXXXXXX
于 2015-05-15T13:43:50.230 に答える
1

Equals は例外に対して適切に実装されていません。メッセージやスタック トレースを自分で比較する必要があります。

于 2015-05-15T13:36:52.340 に答える