断言等于int long float

Pav*_*oba 19 java junit

是否有一种优雅的方式断言数字是平等的,而忽略了他们的类?我想在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,intdouble原语.

由于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.

  • 使用`equals`来比较`BigDecimals`时的必要谨慎:它与`compareTo`不一致,因为它也考虑了规模,[BigDcimal.equals的JavaDocs](http://docs.oracle.com/javase/8 /docs/api/java/math/BigDecimal.html#equals-java.lang.Object-)另见http://stackoverflow.com/q/6787142 (2认同)

Ste*_*n C 6

根据我对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也可以.