我最近遇到了下面解释的问题,我无法找到解释。我的测试代码看起来不错,但测试失败了。我花了一段时间来理解错误,特别是因为我的测试代码并不像下面提到的那样简单。
我正在与你们分享它,希望能找到一些解释并得出结论是否是JMockit错误或所需的行为,因此在实施我们的测试时需要注意。
代码中的注释将显示问题所在。
提前感谢您的意见。
package my.tst.pkg;
import mockit.Expectations;
import mockit.Mocked;
import org.testng.annotations.Test;
import java.util.Collection;
import static java.util.Arrays.asList;
import static org.testng.AssertJUnit.assertFalse;
public class ConsecutiveExpectationsTest {
class KeyHolder{
private String key;
String getKey() {
return key;
}
}
class ClassUnderTest {
private Collection<KeyHolder> keyHolders;
ClassUnderTest(Collection<KeyHolder> keyHolders) {
this.keyHolders = keyHolders;
}
boolean isValid() {
// At least one holder with no key means invalid
return !keyHolders.stream().filter(kh -> kh.getKey() == null).findFirst().isPresent();
}
}
@Mocked
KeyHolder keyHolder;
@Test
public void shouldBeInvalidIfNullKey() throws Exception {
new Expectations() {{
// This expectations fail the test
keyHolder.getKey(); returns("KEY", null);
// However if casting the null to a String the test will pass
// Is this something we should always do?
// keyHolder.getKey(); returns("KEY", (String) null);
}};
assertFalse(new ClassUnderTest(asList(keyHolder, keyHolder)).isValid());
}
}
答案 0 :(得分:0)
这是一种模糊使用Java语言的情况,一个(不错的)Java IDE应该向用户报告。
IntelliJ,例如,向var-arg方法报告“混淆'null'参数”警告。
这是令人困惑/不明确的,因为returns(...)
方法的第二个参数是Object... remainingValues
varargs参数(在字节码中只是一个数组),并且由于Java编译器构建的方式调用的数组参数。如果您只是传递null
,则编译器会将其解释为(Object[]) null
,将而不是解释为new Object[] {null}
。将其转换为String
消除了歧义,迫使编译器生成一个null
元素的数组。
也就是说,JMockit可以将null Object[]
参数解释为等同于单元素数组。这种变化可能会在未来的版本中出现;现在,应该使用特定元素类型的强制转换(对于那些使用IntelliJ的人来说,无论如何都需要避免代码检查警告。)