JMockit连续预期

时间:2015-07-17 02:21:38

标签: java jmockit

我最近遇到了下面解释的问题,我无法找到解释。我的测试代码看起来不错,但测试失败了。我花了一段时间来理解错误,特别是因为我的测试代码并不像下面提到的那样简单。

我正在与你们分享它,希望能找到一些解释并得出结论是否是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());
    }
}

1 个答案:

答案 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的人来说,无论如何都需要避免代码检查警告。)

相关问题