1

私のプロジェクトの 1 つで、文字列ベースの単体テストを取り除こうとしています。私が今ターゲットとして持っているクラスの 1 つはParsingResult.

カスタムAssertJアサーションを使用して別のクラスを正常に変換したので、次の「犠牲者」のためにカスタム アサーション クラスを作成しようとしています。クラスは次のようになります。

public final class ParsingResultAssert<V>
    extends AbstractAssert<ParsingResultAssert<V>, ParsingResult<V>>
{
    private ParsingResultAssert(final ParsingResult<V> actual)
    {
        super(actual, ParsingResult.class);
    }

    public static <E> ParsingResultAssert<E> assertResult(
        final ParsingResult<E> actual)
    {
        return new ParsingResultAssert<E>(actual);
    }
}

それをテストするために、最終的に削除したいテストファイルに挿入しようとしました:

public abstract class ParboiledTest<V> {

    public class TestResult<V> {
        public final ParsingResult<V> result;
        private final ParsingResultAssert<V> resultAssert;

        public TestResult(ParsingResult<V> result) {
            this.result = result;
            resultAssert = ParsingResultAssert.assertResult(result); // HERE
        }
    // rest is not relevant

マークされた行で、次のHEREように失敗します。

java.lang.ClassCastException
    at java.lang.Class.cast(Class.java:2999)
    at org.assertj.core.api.AbstractAssert.<init>(AbstractAssert.java:63)
    at com.github.parboiled1.grappa.assertions.ParsingResultAssert.<init>(ParsingResultAssert.java:13)
    at com.github.parboiled1.grappa.assertions.ParsingResultAssert.assertResult(ParsingResultAssert.java:19)
    at org.parboiled.test.ParboiledTest$TestResult.<init>(ParboiledTest.java:42)
    [...]

スタック トレースの最後の行は次の行です。

            resultAssert = ParsingResultAssert.assertResult(result);

そしてorg.assertj.core.api.AbstractAssert.<init>(AbstractAssert.java:63)、これは次のとおりです。

  // we prefer not to use Class<? extends S> selfType because it would force inherited
  // constructor to cast with a compiler warning
  // let's keep compiler warning internal (when we can) and not expose them to our end users.
  @SuppressWarnings("unchecked")
  protected AbstractAssert(A actual, Class<?> selfType) {
    myself = (S) selfType.cast(this); // <-- THIS ONE
    this.actual = actual;
    info = new WritableAssertionInfo();
  }

しかし、私は道に迷っています。なぜこれが起こるのか理解できません。私はすでに 2 つのカスタム アサーションを正常に作成しています (ここここ) が、このエラーが表示されるのはこれが初めてです。ここでの唯一の違いは、アサーション クラスを作成しようとしているクラスに型パラメーターがあることです。

私は何が欠けていますか?

4

1 に答える 1

2

ParsingResultAssertaを classにキャストしようとしていますParsingResultsuperコンストラクターの 2 番目の引数はParsingResultAssert.class、 ではなくにする必要がありParsingResult.classます。

于 2014-05-04T17:57:43.630 に答える