5

単体テスト (TestNG を使用) に jmockit を使用していますが、Expectations クラスを使用して、プリミティブ型 (ブール値) をパラメーターとして受け取るメソッドをマッチャーを使用してモックアウトするのに問題があります。この問題を示すサンプル コードを次に示します。

/******************************************************/
import static org.hamcrest.Matchers.is;

import mockit.Expectations;

import org.testng.annotations.Test;

public class PrimitiveMatcherTest {
  private MyClass obj;

  @Test
  public void testPrimitiveMatcher() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo(with(is(false))), "bas");
      }
    };

    assert "bas".equals(obj.getFoo(false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(boolean arg) {
      if (arg) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}
/******************************************************/

invokeReturning(...) への呼び出しを含む行は、NullPointerException をスローします。

この呼び出しをマッチャーを使用しないように変更すると、次のようになります。

invokeReturning(c.getFoo(false), "bas");

それはうまく動作します。私の実際のコードでは、実際にマルチパラメーターメソッドをモックしていて、別の引数でマッチャーを使用する必要があるため、これは私にとっては良くありません。この場合、Expectations クラスでは、すべての引数がマッチャーを使用する必要があります。

これはバグであると確信しています。または、プリミティブ型でマッチャーを使用できない可能性があります (それは悲しいことです)。誰かがこの問題に遭遇し、それを回避する方法を知っていますか?

4

3 に答える 3

2

したがって、問題は Expectations.with() にあるようです:

   protected final <T> T with(Matcher<T> argumentMatcher)
   {
      argMatchers.add(argumentMatcher);

      TypeVariable<?> typeVariable = argumentMatcher.getClass().getTypeParameters()[0];

      return (T) Utilities.defaultValueForType(typeVariable.getClass());
   }

typeVariable.getClass() への呼び出しは作成者が期待することを実行せず、Utilities.defaultValueFor タイプへの呼び出しは null を返します。プリミティブのブール値を戻すオートボクシングの解除は、NPE の由来です。

invokeReturning(...) 呼び出しを次のように変更して修正しました。

invokeReturning(withEqual(false)), "bas");

ここではもはやマッチャーを使用していませんが、必要なものには十分です。

于 2008-09-18T04:52:00.053 に答える
1

問題は、Expectation の使用と、Matchers がプリミティブ型をサポートしていないことの組み合わせです。

Matchers コードは、基本的にプリミティブ型をサポートしない Generic に依存しています。通常、Matcher の使用は、値のマッチングにより多く使用されます。Java 5 の auto-boxing/unboxing フィーターでは、これは通常問題になりません。

しかし、JMockit の Expectation はそれを値の照合に使用していません。何らかの解析に使用して、メソッド呼び出しのシグネチャ タイプを決定します。この場合、Matchers はブール型になり、メソッドはプリミティブ型になります。したがって、失敗します。それを適切に嘲笑する。

申し訳ありませんが、これに対する回避策をお伝えすることはできません。多分他の誰かが助けることができます。

于 2008-09-18T01:33:25.600 に答える
1

JMockit (リリース 0.982) を変更して、"with(is(false))" やその他の同様のバリエーションが期待どおりに機能するようにしました (null は返されなくなりましたが、内部マッチャー内の実際の引数値が返されます)。

于 2009-06-17T21:45:26.630 に答える