gpt4 book ai didi

java - 如何在 Hamcrest 中使用(原始的)自动装箱/加宽?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:53:12 26 4
gpt4 key购买 nike

我遇到了 https://code.google.com/p/hamcrest/issues/detail?id=130为 Hamcrest 匹配器添加一些语法糖。但这个想法被 Hamcrest 开发人员拒绝了。

还有其他聪明的想法可以通过避免在 long 后面键入 L 来提高测试的可读性吗?

@Test
public void test1() {
int actual = 1;
assertThat(actual, is(1));
}

@Test
public void test2() {
long actual = 1L;
assertThat(actual, is(1)); // fails as expected is <1> but result was <1L>
// assertThat(actual, is(1L)); off course works..
}

@Test
public void test3() {
Long actual = new Long(1);
assertThat(actual, is(1)); // fails as expected is <1> but result was <1L>
}

更新

比较时,请参见下面的差异,例如int 和 long 使用默认的 Java 语言 (==)、标准的 junit assert (assertTrue) 和 hamcrest is() 方法。似乎奇怪的 hamcrest 不支持匹配/比较 long 与 int,其余的是。

@Test
public void test2() {
long actual = 1L;
int expected = 1;
assertTrue(expected == actual); // std java succeeds
assertEquals(expected, actual); // std junit succeeds
assertThat(actual, is(expected)); // hamcrest fails: Expected: is <1> but: was <1L>
}

最佳答案

这与您链接的问题完全无关,该问题是关于解决有故障的静态分析器并被正确拒绝的。当混合基本类型时,您遇到的问题在 Java 中很常见。

为了避免输入 L您必须提供所有匹配器的重载版本——而不仅仅是 is .考虑这些例子:

assertThat(longValue, greaterThan(1));
assertThat(longList, contains(1, 2, 3));

更新

您可以轻松添加自己的重载版本来执行转换:

public static Matcher<Long> is(Integer value) {
return org.hamcrest.core.Is.is(value.longValue());
}

当然,现在您可以从 int 转换一个至 long你会想要 float 的和 double :

public static Matcher<Long> is(Float value) {
return org.hamcrest.core.Is.is(value.longValue());
}

public static Matcher<Long> is(Double value) {
return org.hamcrest.core.Is.is(value.longValue());
}

因为 Java 不会自动从 byte 转换至 Integer *,您还需要 byte 的版本和 short .这已经够难看的了,但是如何转换为其他类型呢,例如,从 intdouble

public static Matcher<Double> is(Integer value) {
return org.hamcrest.core.Is.is(value.doubleValue());
}

Compile Error: Duplicate method is(Integer)

呃哦!这些都行不通,因为 Java 不允许您根据返回类型重载方法。您必须在我留给您的单独类中声明这些方法。

考虑到这会造成巨大的困惑,我怀疑 Hamcrest 的作者是否愿意接受这样的添加,因为返回很低。老实说,使用 1L 会更好和 1.0根据需要。

* 虽然编译器byte 转换至 int可以装箱到 Integer .

关于java - 如何在 Hamcrest 中使用(原始的)自动装箱/加宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26437839/

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