Использование assertArrayEquals () с подстановочными знаками? - PullRequest
3 голосов
/ 25 октября 2011

Я хочу проверить код, который создает байтовые массивы, используемые для отправки в виде пакетов 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]));
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Вы можете просто написать ожидаемый массив как массив целых чисел и использовать специальное значение (например, -1) для представления подстановочного знака. Это тот же трюк, что и методы чтения входных потоков. Вам просто нужно написать свой кастом assertEqualsWithWildCard(int[] expected, byte[] actual).

1 голос
/ 25 октября 2011

Если вы собираетесь писать много такого кода, я бы написал отдельный класс для «декодирования» пакета в значимые поля.Затем (конечно, после проверки работоспособности самого класса) вы можете написать разумные тесты, такие как

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

и т. Д.

Таким образом, вы не «пропускаете случайные байты», и вашикод будет намного более читабельным (если немного более многословным).

...