java – 将jmockit期望与匹配器和原始类型一起使用
作者:互联网
我正在使用jmockit进行单元测试(使用TestNG),并且我在使用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类要求所有参数都使用匹配器.
我很确定这是一个错误,或者也许不可能将Matchers与原始类型一起使用(这会让我感到难过).有没有人遇到过这个问题,并且知道如何绕过它?
解决方法:
问题是Expectation的使用和Matchers不支持原始类型的组合.
Matchers代码依赖于Generic,它基本上不支持基本类型.通常,匹配器的使用更多地用于匹配值;使用Java 5中的自动装箱/拆箱功能,这通常不是问题.
但是JMockit的Expectation没有使用它来匹配值,它使用它进行某种解析来确定方法调用签名类型..在这种情况下,Matchers将导致布尔类型,而你的方法是原始类型.所以它失败了正确地嘲笑它.
对不起,我不能告诉你这方面的任何解决方法.也许别人可以提供帮助.
标签:java,unit-testing,mocking,jmockit 来源: https://codeday.me/bug/20190701/1345371.html