当前位置: 首页 > 知识库问答 >
问题:

断言等于int long浮点数

钱朝明
2023-03-14

有没有一种优雅的方法来断言数字相等而忽略它们的类?我想在JUnit测试框架中使用它,但例如

Assert.assertEquals(1,1L)

因Java . lang . assertion错误而失败:应为:java.lang.Integer

我希望在某个地方有一个很好的方法,只比较值,并与int,long,float,byte,double,BigDecimal,BigInteger一起工作...

共有3个答案

蒋永宁
2023-03-14

将该功能包装在您自己的匹配器中,并与< code>assertThat一起使用。

样品匹配器:

class IsAnyNumber extends BaseMatcher {
  final Object expected;
  //...
  public boolean matches(Object actual) {
    // compare / transform / check type / ensure: String, double, int, long
    // example via BigDecimal as seen from Mena (without checks)
    return new BigDecimal(expected).equals(new BigDecimal(actual));
  }
  // ...
}

// somewhere else:
public static IsAnyNumber is(Object expected) {
  return new IsAnyNumber(expected);
}

然后在测试中调用这个静态方法:

assertThat(1, is(1L));
assertThat(1, is(1.0));
assertThat(1L, is(1));

通过这种方式,您可以重用您的匹配器,并且assert语句最终更具可读性。

免责声明:这只是伪代码,尚未经过测试,但应该进行一些调整。

但是也要注意Java中的比较数字

公冶谦
2023-03-14

根据我对JLS的阅读,重载分辨率

Assert.assertEquals(1,1L)

应解析为

Assert.assertEquals(long, long)

简而言之,问题中的代码片段不是您实际问题的有效示例

(声明一下,< code>assertEquals(long,long)、< code>assertEquals(float,float)和< code>assertEquals(double,double)都是通过严格调用来适用的,第一个是最具体的;参见15.12.2.2 JLS。严格的调用上下文允许原语扩展,但不允许装箱或取消装箱。)

如果(如证据所示)您的调用解析为< code > assert . assert equals(Object,Object),这意味着其中一个操作数必须已经是装箱类型。该重载的问题是,它使用< code>equals(Object)方法来比较对象,并且该方法的协定指定,如果对象各自的类型不同,则结果为< code>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)


 

编写自定义匹配器也可以。

段干弘扬
2023-03-14

有一些开销的一种解决方法是将值包装在BigDecimal对象中,因为<code>BigDemical、<code>int和<code>double

因为<code>是新的BigDecimal(1l)。等于(新的BigDecimal(1.0))保持<code>true,

Assert.assertEquals(new BigDecimal(1.0), new BigDecimal(1l));  

应该为你工作。

编辑

正如Hulk在下面所说,BigDecimal对象的比例用于equals比较,但不用于compareTo比较。虽然对于获取long的构造函数,比例设置为默认的0,但它是通过获取Double的构造函数中的一些计算推断出来的。因此,比较值的最安全方法(即在Double值的边缘情况下)可能是通过调用compareTo并检查结果是0代替。

 类似资料:
  • 问题内容: 我需要比较两个值:一个是字符串,另一个是float,因此我将字符串转换为float,然后尝试调用,但这未经授权,我猜不接受float作为参数。 在这种情况下,对我有什么解决方案? 问题答案: 您必须为Floats的断言提供一个增量: 增量是期望值与实际值之间的最大差异(delta),对于这两个数字,仍将其视为相等。

  • 众所周知,在比较浮点值时必须小心。通常,我们不使用,而是使用一些基于epsilon或ULP的相等性测试。 然而,我想知道,当使用时,是否存在任何情况? 看看这个简单的片段,哪些案例可以保证成功? 注意:我已经检查了这个和这个,但是它们不包括我的(所有)病例。 注2:似乎我必须添加一些附加信息,因此答案在实践中可能很有用:我想知道: C标准的内容 这是我在当前标准草案中发现的唯一相关声明: 浮点类型

  • 问题内容: 我想从浮点数中删除数字,以使小数点后的位数固定不变,例如: 我需要作为字符串输出到另一个函数,而不是打印。 我也想忽略丢失的数字,而不是四舍五入。 问题答案: 首先,对于那些只需要复制和粘贴代码的人来说,该函数是: 这在Python 2.7和3.1+中有效。对于较旧的版本,不可能获得相同的“智能舍入”效果(至少,并非没有很多复杂的代码),但是在截断前舍入到小数点后12位将在大多数时间起

  • 通过类似于的方式比较两个浮点数会带来麻烦,因为由于舍入错误,可能不等于。 一个人通常做的事情类似于

  • 在我的JUnit测试中,我将预期的XML文件与解析器创建的虚拟文档进行比较: 但区别声称并不相似。那么如何正确比较这两个XML文档呢?

  • 我试着 我在调试时获得和是。 如何在使用时断言大于条件