3

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]));
        }
    }
}
4

2 に答える 2

2

期待される配列を整数の配列として記述し、ワイルドカードを表すために特別な値(-1など)を使用することができます。これは、入力ストリームの読み取りメソッドと同じトリックです。あなたはただあなたのカスタムを書かなければならないでしょうassertEqualsWithWildCard(int[] expected, byte[] actual)

于 2011-10-25T07:25:02.847 に答える
1

このようなコードをたくさん書く場合は、パケットを意味のあるフィールドに「デコード」するための別のクラスを作成します。次に(もちろん、クラス自体が機能することをテストした後)、次のような賢明なテストを作成できます。

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

そうすれば、「ランダムなバイトを省略」することはなく、コードははるかに読みやすくなります(少し冗長な場合)。

于 2011-10-25T07:22:05.393 に答える