Mockito matcher và mảng nguyên thủy


226

Với Mockito, tôi muốn thực hiện verify()một cuộc gọi phương thức byte[]trong danh sách đối số của nó, nhưng tôi không tìm thấy cách viết này.

 myMethod( byte[] )

Tôi chỉ muốn một cái gì đó như anyByteArray(), làm thế nào để làm điều đó với Mockito?


Bạn có thực sự không quan tâm nội dung của mảng byte là gì không? Tôi thấy điều này rất nhiều trong thử nghiệm đơn vị, nơi mọi người sử dụng công cụ đối sánh anyX () vì chúng tiện lợi, nhưng thực tế bạn hầu như luôn quan tâm đến những gì được truyền vào. Nếu bạn không sử dụng Câu trả lời thực sự tiêu tốn giá trị, có lẽ bạn phải phù hợp với một đối số dự kiến ​​thực tế.
Matunos

@Matunos: Điều đó gây tranh cãi. Sử dụng bất kỳ công cụ đối sánh nào có thể làm cho các bài kiểm tra đơn giản hơn và người tiếp theo nhìn vào bài kiểm tra sẽ không bị phân tâm bởi kết hợp chính xác không cần thiết và có thể tập trung vào mục đích thực tế của bài kiểm tra.
Malik Atalla

@tbruelle: Xin lưu ý rằng mọi mảng trong Java là một đối tượng. Điều đó sẽ giúp bạn lúc bắt đầu.
Tomasz Przybylski

Câu trả lời:


424

Tôi sẽ thử any(byte[].class)


34
Nếu bạn muốn xác minh một byte cụ thể [] bạn có thể sử dụngAdditionalMatchers.aryEq(expectedArray)
John Oxley

5
Hoặc Bộ so khớp. <Byte []> any ().
jbyler


12

Tôi thà sử dụng Matchers.<byte[]>any(). Điều này làm việc cho tôi.


1
Cảnh báo cho mọi người: Bây giờ không được chấp nhận vì vậy tôi sẽ đi đến câu trả lời được bình chọn Mockito.any (byte []. Class)
Chexir

10

Tôi đồng ý với Mutanos và Alecio. Hơn nữa, người ta có thể kiểm tra càng nhiều cuộc gọi phương thức giống hệt nhau càng tốt (xác minh các cuộc gọi tiếp theo trong mã sản xuất, thứ tự xác minh không thành vấn đề). Đây là mã:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));


0

Bạn có thể sử dụng Mockito.any () khi các đối số cũng là mảng. Tôi đã sử dụng nó như thế này:

verify(myMock, times(0)).setContents(any(), any());

0

Những gì làm việc cho tôi là org.mockito.ArgumentMatchers.isA

ví dụ:

isA(long[].class)

hoạt động tốt

sự khác biệt thực hiện của nhau là:

public static <T> T any(Class<T> type) {
    reportMatcher(new VarArgAware(type, "<any " + type.getCanonicalName() + ">"));
    return Primitives.defaultValue(type);
}

public static <T> T isA(Class<T> type) {
    reportMatcher(new InstanceOf(type));
    return Primitives.defaultValue(type);
}

-1

Bạn luôn có thể tạo Trình so khớp tùy chỉnh bằng cách sử dụng argThat

Mockito.verify(yourMockHere).methodCallToBeVerifiedOnYourMockHere(ArgumentMatchers.argThat(new ArgumentMatcher<Object>() {
    @Override
    public boolean matches(Object argument) {
        YourTypeHere[] yourArray = (YourTypeHere[]) argument;
        // Do whatever you like, here is an example:
        if (!yourArray[0].getStringValue().equals("first_arr_val")) {
            return false;
        }
        return true;
    }
}));

Viết một công cụ đối sánh tùy chỉnh, khi Mockito có khả năng xử lý trường hợp sử dụng này chỉ là thêm nợ kỹ thuật.
linuxdan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.