gpt4 book ai didi

java - 将 jmockit 期望与匹配器和原始类型一起使用

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:11 25 4
gpt4 key购买 nike

我正在使用 jmockit 进行单元测试(使用 TestNG),我在使用 Expectations 类模拟一个使用原始类型( 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(...) 的行抛出 NullPointerException。

如果我将此调用更改为不使用匹配器,如下所示:

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

它工作得很好。这对我没有好处,因为在我的真实代码中,我实际上是在模拟一个多参数方法,我需要在另一个参数上使用匹配器。在这种情况下,Expectations 类要求所有 参数使用匹配器。

我很确定这是一个错误,或者可能无法将 Matchers 与原始类型一起使用(这会让我很难过)。有没有人遇到过这个问题,并且知道如何解决它?

最佳答案

所以问题似乎出在 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。原始 boolean 值的反自动装箱是 NPE 的来源。

我通过将 invokeReturning(...) 调用更改为:

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

我在这里不再使用匹配器,但它足以满足我的需要。

关于java - 将 jmockit 期望与匹配器和原始类型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/88743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com