我遇到https://code.google.com/p/hamcrest/issues/detail?id=130为Hamcrest匹配器添加一些糖语法。但是这个想法被Hamcrest开发者拒绝了。
任何其他聪明的想法,通过避免必须在长期后面输入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是()方法。似乎奇怪的是,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>
}
答案 0 :(得分:4)
这与您链接的问题完全无关,该问题涉及解决有故障的静态分析仪并被正确拒绝。在混合基元类型时,您遇到的问题在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
的版本。这很丑陋,但是如何转换到其他类型,例如从int
到double
?
public static Matcher<Double> is(Integer value) {
return org.hamcrest.core.Is.is(value.doubleValue());
}
哦,哦!这些都不起作用,因为Java不允许您根据返回类型重载方法。您必须在我留给您的单独课程中声明这些方法。编译错误:重复方法是(整数)
鉴于这将造成巨大的混乱,我怀疑Hamcrest的作者会因为低收益而对这样的加成开放。老实说,根据需要使用1L
和1.0
,你明白了。
*虽然编译器将从byte
转换为int
,但可以将其设置为Integer
。