有没有一种优雅的方法来断言数字相等而忽略它们的类?我想在JUnit测试框架中使用它,但例如
Assert.assertEquals(1,1L)
因Java . lang . assertion错误而失败:应为:java.lang.Integer
我希望在某个地方有一个很好的方法,只比较值,并与int,long,float,byte,double,BigDecimal,BigInteger一起工作...
将该功能包装在您自己的匹配器中,并与< 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中的比较数字
根据我对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)
编写自定义匹配器
也可以。
有一些开销的一种解决方法是将值包装在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文档呢?
我试着 我在调试时获得和是。 如何在使用时断言大于条件