【问题标题】:JUnit error while casting to byte?转换为字节时出现 JUnit 错误?
【发布时间】:2016-12-11 20:46:17
【问题描述】:

我编写了一个简单的算法,将字符串格式的二进制数转换为字节数组。我用int计算8位的数值,然后转换成字节。

当我在 JUnit 中运行以下代码时出现问题:

assertEquals( new byte[] {(byte) 0} , Set1.binToBytes("00000000") );

所以一个有 8 个零的字符串应该产生一个 0 字节。它以 AssertionError 结束。在调试过程中跟踪变量时,我发现了以下内容:

预期:[0] 实际:[0]

这是 JUnit 中的错误,还是我搞砸了什么?以上两种是不同的类型吗?

运行整个JUnit测试后,发现如下错误:

java.lang.AssertionError: expected:<[B@65e2dbf3> but was:<[B@4f970963>

【问题讨论】:

  • Equals(和 assertEquals)不检查数组是否相等:arr1.equals(arr2) 只有当 arr1 == arr2 时才为真。

标签: java junit casting byte assertion


【解决方案1】:

数组不会覆盖equals 方法。您不应该使用assertEquals 来比较数组。相反,您应该使用assertArrayEquals:

assertArrayEquals( new byte[] {(byte) 0} , Set1.binToBytes("00000000") );

【讨论】:

  • 你的意思是我不应该使用 assertEquals。
【解决方案2】:

另一种选择:只需转到 一个 断言一个真正需要的:assertThat

此断言适用于 Hamcrest 匹配器;所以你可以写下这样的代码:

assertThat(actual, is(expected))

还有一件好事......只要actualexpected 有匹配的类型(简单对象、数组、集合、你的名字)......上面的代码将完全按照你的想法应该这样做。

它会为您提供一个包含两个数组的清晰的错误消息,以防它们不匹配!

一旦你习惯了;你会发现不再需要使用任何其他的 assert 变体。

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多