是否有一种优雅的方式断言数字是平等的,而忽略了他们的类?我想在JUnit测试框架中使用它,例如
Assert.assertEquals(1,1L)
Run Code Online (Sandbox Code Playgroud)
失败的java.lang.AssertionError:expected:java.lang.Integer <1>但是:java.lang.Long <1>
我希望有一个很好的方法,只比较值,并使用int,long,float,byte,double,BigDecimal,BigInteger,你命名它...
Men*_*ena 12
一些开销的一种解决方法是将包裹中的值的BigDecimal对象,BigDecimal构造函数重载需要long,int和double原语.
由于new BigDecimal(1l).equals(new BigDecimal(1.0))持有true,
Assert.assertEquals(new BigDecimal(1.0), new BigDecimal(1l));
Run Code Online (Sandbox Code Playgroud)
应该适合你.
编辑
正如Hulk在下面所述,BigDecimal对象的比例用于equals比较,但不用于compareTo比较.虽然比例被设置0为构造函数的默认值long,但它是通过构造函数中的一些计算推断出来的double.因此,比较值的最安全的方法(即在值的边缘情况下double)可能是通过调用compareTo和检查结果0.
根据我对JLS的解读,重载分辨率为
Assert.assertEquals(1,1L)
Run Code Online (Sandbox Code Playgroud)
应该解决
Assert.assertEquals(long, long)
Run Code Online (Sandbox Code Playgroud)
(根据记录,assertEquals(long, long),assertEquals(float, float)和assertEquals(double, double)是适用通过严格调用,和第一个是最具体的;参见JLS 15.12.2.2严格调用上下文允许原始加宽,但不是拳击或取消装箱.)
如果(证据表明)你的调用正在解析Assert.assertEquals(Object, Object),那意味着其中一个操作数必须已经是一个盒装类型.该重载的问题在于它使用该equals(Object)方法来比较对象,并且该方法的契约指定结果是false对象的相应类型是否不同.
如果这是您的真实代码中发生的事情,那么我怀疑使用该命令的建议is(T) Matcher也可以.该is(T)匹配相当于is(equalTo(T))后者依赖于equals(Object)...
有现成的"好方法"吗?
AFAIK,没有.
我认为真正的解决方案是对类型更加关注; 例如
int i = 1;
Long l = 1L;
Assert.assertEquals(i, l); // Fails
Assert.assertEquals((long) i, l); // OK - assertEquals(Object, Object)
Assert.assertEquals((Long) i, l); // OK - assertEquals(Object, Object)
Assert.assertEquals(i, (int) l); // OK - assertEquals(long, long)
// it would bind to an (int, int)
// overload ... it it existed.
Assert.assertEquals(i, (long) l); // OK - assertEquals(long, long)
Run Code Online (Sandbox Code Playgroud)
编写自定义Matcher也可以.
| 归档时间: |
|
| 查看次数: |
15885 次 |
| 最近记录: |