我使用的jmockit单元测试(与TestNG),和我有麻烦使用的预期流的模拟出一个方法,需要一个基本类型(boolean)作为一个参数使用一个匹配.这里的一些代码样本,说明了问题。

/******************************************************/
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(...)引发一个异常.

如果我改变这一呼吁不要使用一个匹配,如:

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

它的工作原理就好了。这是对我没有好处,因为在我真正的代码实际上,我嘲笑一个多参数的方法,我需要使用一匹配上的另一个论点。在这种情况下,期望类需要, 所有 参数使用一个匹配.

我敢肯定这是一个错误,或者也许这是不可能的使用匹配器与基本类型(这将使我sad)。有人遇到这个问题,并知道怎么去解决它吗?

有帮助吗?

解决方案 2

所以,该问题似乎是在预期。与():

   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()没有做什么提交人的期望,并呼吁实用工具。defaultValueFor类型返回空。De-自动装箱回来的原始的布尔的价值是在展会上来。

我固定的,它通过改变invokeReturning(...)呼吁:

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

我不再使用一个匹配,但这是不够好为什么我需要的。

其他提示

问题是组合的预期使用情况和这匹配器不支持原型。

这匹配器代码依靠通用这基本上不支持原型。通常使用的匹配器更为匹配值;与自动装箱/拆箱feater在Java5,这通常不是一个问题。

但JMockit的期望是不使用这匹配值,它使用它对某些种类的分析,以确定该方法的呼吁的签名类型..,在这种情况下的匹配器将导致在布尔的类型而你的方法是原始的。因此,它失败,以嘲笑它的正确。

我很抱歉,我不能告诉你任何解决办法。也许别人可以提供帮助。

我改变了JMockit(释放0.982)以便"与(是(false))"和其他类似的变化,现在预期的工作(它不再返回null,但实际的参数值的内匹配器).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top