Mockito matcher และอาร์เรย์ของดั้งเดิม


226

ด้วย Mockito ฉันต้องการverify()เรียกวิธีด้วยbyte[]ในรายการอาร์กิวเมนต์ แต่ไม่พบวิธีเขียนสิ่งนี้

 myMethod( byte[] )

ฉันแค่ต้องการบางสิ่งเช่นanyByteArray()นี้จะทำอย่างไรกับ Mockito


คุณไม่สนใจสิ่งที่เป็นเนื้อหาของอาร์เรย์ไบต์หรือไม่ ฉันเห็นสิ่งนี้มากในการทดสอบหน่วยที่ผู้ใช้ matchers ใด ๆ X () เพราะสะดวก แต่ในความเป็นจริงคุณควรใส่ใจสิ่งที่กำลังผ่านเข้ามาถ้าคุณไม่ได้ใช้คำตอบที่ใช้ค่าจริง ควรจับคู่กับข้อโต้แย้งที่เกิดขึ้นจริง
Matunos

@Matunos: เป็นที่ถกเถียงกัน การใช้เครื่องมือจับคู่ใด ๆ สามารถทำให้การทดสอบง่ายขึ้นและบุคคลต่อไปที่ดูการทดสอบจะไม่ถูกรบกวนโดยการจับคู่ที่แม่นยำโดยไม่จำเป็นและสามารถมุ่งเน้นไปที่วัตถุประสงค์การทดสอบที่แท้จริง
Malik Atalla

@tbruelle: โปรดจำไว้ว่าทุกอาร์เรย์ใน Java เป็นวัตถุ ที่จะช่วยคุณในการเริ่มต้น
Tomasz Przybylski

คำตอบ:


424

ฉันจะพยายาม any(byte[].class)


34
หากคุณต้องการตรวจสอบไบต์เฉพาะ [] คุณสามารถใช้AdditionalMatchers.aryEq(expectedArray)
John Oxley

5
หรือ Matchers <byte []> any ()
jbyler


12

Matchers.<byte[]>any()ผมค่อนข้างจะใช้ สิ่งนี้ใช้ได้สำหรับฉัน


1
คำเตือนสำหรับทุกคน: ตอนนี้เลิกใช้แล้วดังนั้นฉันจะไปตอบ Mockito.any (byte []. class)
Chexpir

10

ฉันเห็นด้วยกับ Mutanos และ Alecio นอกจากนี้เราสามารถตรวจสอบวิธีการโทรที่เหมือนกันได้หลายวิธี (ตรวจสอบการโทรที่ตามมาในรหัสการผลิต, ลำดับของการตรวจสอบไม่สำคัญ) นี่คือรหัส:

import static org.mockito.AdditionalMatchers.*;

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


0

คุณสามารถใช้ Mockito.any () เมื่ออาร์กิวเมนต์เป็นอาร์เรย์เช่นกัน ฉันใช้มันแบบนี้:

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

0

อะไรที่เหมาะกับฉันคือ org.mockito.ArgumentMatchers.isA

ตัวอย่างเช่น:

isA(long[].class)

มันใช้งานได้ดี

ความแตกต่างของการปฏิบัติซึ่งกันและกันคือ:

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

คุณสามารถสร้าง Matcher ที่กำหนดเองได้ตลอดเวลาโดยใช้ 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;
    }
}));

การเขียน matcher ที่กำหนดเองเมื่อ Mockito สามารถจัดการกรณีการใช้งานนี้ได้ก็เป็นการเพิ่มหนี้ทางเทคนิคเท่านั้น
linuxdan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.