Mar*_*ijk 8 java autoboxing hamcrest
我遇到了https://code.google.com/p/hamcrest/issues/detail?id=130,为Hamcrest匹配器添加了一些糖语法.但这个想法遭到了Hamcrest开发者的拒绝.
任何其他聪明的想法,通过避免在longs后面输入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>
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
使用默认Java语言(==),标准junit assert(assertTrue)和hamcrest is()方法比较例如int和long时的差异.似乎奇怪的是,hamcrest doest不支持匹配/比较long vs 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>
}
Run Code Online (Sandbox Code Playgroud)
这与您链接的问题完全无关,该问题是关于解决有问题的静态分析器并被正确拒绝。在混合原始类型时,您遇到的问题在 Java 中很常见。
为了避免输入,L您必须提供所有匹配器的重载版本——而不仅仅是is. 考虑以下示例:
assertThat(longValue, greaterThan(1));
assertThat(longList, contains(1, 2, 3));
Run Code Online (Sandbox Code Playgroud)
更新
您可以轻松添加自己的重载版本来执行转换:
public static Matcher<Long> is(Integer value) {
return org.hamcrest.core.Is.is(value.longValue());
}
Run Code Online (Sandbox Code Playgroud)
当然,既然你有一个可以转换为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());
}
Run Code Online (Sandbox Code Playgroud)
由于Java不会自动转换byte到Integer*,您还需要版本byte和short。这已经够丑了,但是如何转换为其他类型,例如 from intto double?
public static Matcher<Double> is(Integer value) {
return org.hamcrest.core.Is.is(value.doubleValue());
}
Run Code Online (Sandbox Code Playgroud)
编译错误:重复方法是(整数)
哦哦!这些将不起作用,因为 Java 不允许您根据返回类型重载方法。您必须在我留给您的单独类中声明这些方法。
鉴于这会造成巨大的混乱,我怀疑 Hamcrest 的作者会因为回报低而接受这样的添加。老实说,您最好根据需要使用1L和进行明确1.0。
* 虽然编译器会从 转换byte为int可以装箱的Integer.
| 归档时间: |
|
| 查看次数: |
7790 次 |
| 最近记录: |