【问题标题】:Using assertArrayEquals() with wildcards?将 assertArrayEquals() 与通配符一起使用?
【发布时间】:2011-10-25 07:06:13
【问题描述】:

我想测试生成用于作为 UDP 数据包发送的字节数组的代码。

虽然我无法重现测试中的每个字节(例如随机字节、时间戳),但我想测试我可以预先确定的字节。

使用 JUnit 4.8(和 Mockito 1.8)是否可以实现以下操作?

Packet packet = new RandomPacket();

byte[] bytes = new byte[] {
    0x00, 0x02, 0x05, 0x00, anyByte(), anyByte(), anyByte(), anyByte(), 0x00
};

assertArrayEquals(packet.getBytes(), bytes);

上面的示例当然不起作用,我只是在寻找一种在assertArrayEquals() 中使用某种通配符的方法。

PS:我现在唯一的选择是单独检查每个字节(并忽略随机字节)。但这很乏味,而且不能真正重复使用。


感谢 JB Nizet 的回答,我现在有了以下代码,工作正常:

private static int any() {
    return -1;
}

private static void assertArrayEquals(int[] expected, byte[] actual) {
    if(actual.length != expected.length) {
        fail(String.format("Arrays differ in size: expected <%d> but was <%d>", expected.length, actual.length));
    }

    for(int i = 0; i < expected.length; i ++) {
        if(expected[i] == -1) {
            continue;
        }

        if((byte) expected[i] != actual[i]) {
            fail(String.format("Arrays differ at element %d: expected <%d> but was <%d>", i, expected[i], actual[i]));
        }
    }
}

【问题讨论】:

    标签: java junit bytearray mockito hamcrest


    【解决方案1】:

    您可以简单地将预期数组写为整数数组,并使用特殊值(例如 -1)来表示通配符。这与输入流的读取方法相同。您只需编写您的自定义assertEqualsWithWildCard(int[] expected, byte[] actual)

    【讨论】:

    • 一个简单但可读的解决方案。为什么我没有考虑到这一点?我将代码添加到我的问题中。
    • 也许使用Byte[] 会更合适?那么通配符就是null。这将是Byte[] 真正有用的少数情况之一;-)
    • @Joachim :使用 ints 还具有能够轻松编写字节文字的优点:0xBC vs. (byte) 0xBC
    • @JB:我明白了,在这种情况下,答案中的代码不正确,'虽然。因为它在if(expected[i] != actual[i]) 行中缺少byte 的演员表:应该是if ((byte) expected[i] != actual[i])
    • 确实如此。并且参数的顺序应该颠倒,因为 JUnit 约定是将期望值作为第一个参数,将实际值作为第二个参数。
    【解决方案2】:

    如果您要编写大量这样的代码,我会编写一个单独的类来将数据包“解码”为有意义的字段。然后(当然,在测试类本身有效之后)您可以编写合理的测试,例如

    assertEquals(42, packet.length());
    assertEquals(0xDEADBEEF, packet.checksum());
    

    等等

    这样,您就不会“省略随机字节”,并且您的代码将更具可读性(如果更冗长的话)。

    【讨论】:

    • 这听起来不错,但似乎有点太多了,因为没有那么多数据包要测试。
    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 2014-09-20
    • 2018-05-15
    • 2016-11-08
    • 2017-12-11
    • 2023-03-29
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多