Frage

Ich bin mit JMockit für Unit-Tests (mit TestNG), und ich habe Probleme, die Erwartungen Klasse mit einer Methode zu verspotten, die einen primitiven Typen (boolean) als Parameter übernimmt, einen Matcher verwenden. Hier einige Beispielcode, der das Problem veranschaulicht.

/******************************************************/
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";
      }
    }
  }
}
/******************************************************/

Die Linie um den Anruf zu invokeReturning, die (...) wirft eine Nullpointer.

Wenn ich diesen Anruf ändern keinen Matcher zu verwenden, wie in:

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

es funktioniert gut. Das ist nicht gut für mich, denn in meinem wirklichen Code, den ich eigentlich bin ein Multi-Parameter-Methode spöttisch und ich brauche eine Matcher auf ein anderes Argument zu verwenden. In diesem Fall erfordert die Erwartungen Klasse, die alle Argumente verwenden, um eine Matcher.

Ich bin mir ziemlich sicher, dass dies ein Fehler ist, oder es ist vielleicht nicht möglich Matchers mit primitiven Typen zu verwenden (das würde mich traurig machen). Hat jemand dieses Problem gestoßen, und weiß, wie um es zu bekommen?

War es hilfreich?

Lösung 2

So ist das Problem in Expectations.with zu sein scheint ():

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

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

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

Der Aufruf von typeVariable.getClass () nicht tut, was der Autor erwartet, und der Aufruf von Utilities.defaultValueFor Typ null zurück. Die de-Autoboxing die die primitive Booleschen Wert zurück, wo der NPE kommt.

ich es fixiert, indem der invokeReturning Wechsel (...) rufen an:

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

Ich bin nicht mehr einen Matcher hier verwendet wird, aber es ist gut genug für das, was ich brauche.

Andere Tipps

das Problem ist die Kombination aus Erwartung Nutzung und dass Matchers nicht primitiven Typen nicht unterstützt.

Der Matchers Code stützt sich auf Generika, die im Grunde nicht primitiven Typen nicht unterstützt. Typischerweise ist die Verwendung von mehr Matchers für Wert übereinstimmt; mit dem Auto-Box / Unboxing feater in Java 5, ist dies in der Regel kein Problem dar.

Aber JMockit Erwartung wird ihn nicht für Wert übereinstimmt, verwendet er es für eine Art von Parsen des Methodenaufruf Signatur type..which in diesem Fall zu bestimmen, die Matchers in Boolesche Typ geführt werden, während die Methode Urtyp ist .. so ist es nicht, es richtig zu verspotten.

Es tut mir leid, dass ich nicht sagen, können Sie jede Abhilfe für dieses. Vielleicht jemand anders helfen kann.

Ich änderte JMockit (Release 0,982), so dass „mit (ist (false))“ und andere ähnliche Variationen nun wie erwartet (es nicht mehr gibt null zurück, aber die tatsächliche Argument Wert innerhalb des inneren Matcher).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top