使用jmockit期望匹配器和基本类型
-
01-07-2019 - |
题
我使用的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,但实际的参数值的内匹配器).