2.1 คำอธิบายประกอบ @Mock

มีสองวิธีในการทำงานกับวัตถุจำลองใน Mockito อย่างแรกคือการสร้างวัตถุเสมือนทั้งหมดอย่างที่สองคือการรวมวัตถุที่มีอยู่ในกระดาษห่อ เริ่มกันที่อันแรก

ในการสร้างวัตถุเสมือนทั้งหมด คุณต้องเขียนโค้ด:

ClassName variable name = Mockito.mock(ClassName.class);

ลองสร้างคลาส ArrayList จำลองเป็นตัวอย่าง:

@ExtendWith(MockitoExtension.class)
class MockTest {
    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        List mockList = Mockito.mock(ArrayList.class);
        //these methods won't do anything - they are stubs
        mockList.add("one");
        mockList.add("two");
    }
}

ในตัวอย่างนี้ เราสร้าง ArrayList ปลอมและเก็บข้อมูลอ้างอิงไว้ในตัวแปร mockList วิธีการของวัตถุนี้ไม่ได้ทำอะไรเลย

อย่างไรก็ตาม โค้ดนี้สามารถเขียนให้สั้นลงได้เนื่องจากมีคำอธิบายประกอบพิเศษสำหรับสิ่ง@Mockนี้

@ExtendWith(MockitoExtension.class)
class MockTest {
    @Mock
    List mockList;

    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        //these methods won't do anything - they are stubs
        mockList.add("one");
        mockList.add("two");
    }
}

ในกรณีที่สองMockitoExtensionจะวิเคราะห์รหัสชั้นเรียนและสร้างโครงร่างที่จำเป็น Mockito.mock()คุณ ไม่ จำเป็น ต้องเรียกใช้เมธอด คำอธิบายประกอบหนึ่งรายการและวัตถุเสมือนพร้อมแล้ว ความงาม.

2.2 คำอธิบายประกอบ @Spy

วัตถุประเภทที่สองที่สำคัญใน Mockito คือการห่อหุ้มวัตถุที่มีอยู่ พวกเขาอนุญาตให้ใช้คลาสที่มีอยู่และในทางกลับกันเพื่อสกัดกั้นการเรียกใช้เมธอดและตัวแปรทั้งหมดของวัตถุดังกล่าว: เพื่อแก้ไขงานของพวกเขาเมื่อจำเป็น มีการใช้บ่อยพอๆ กับวัตถุจำลอง

ในการสร้าง wrapper บนวัตถุ คุณต้องเขียนโค้ด:

ClassName variable name = Mockito.spy(an object);

ตัวอย่างที่มีตัวห่อหุ้มรอบคลาส ArrayList:

@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Test
    public void whenMockAnnotation() {
        List<String> mockList = Mockito.spy(new ArrayList<String>());
        //these methods will work!
        mockList.add("one");
        mockList.add("two");
    }
}

ในรูปแบบที่ง่ายที่สุด การเรียกไปยังวัตถุห่อหุ้มเพียงแค่เปลี่ยนเส้นทางการเรียกไปยังวัตถุดั้งเดิม ซึ่งเป็นการอ้างอิงที่วัตถุอยู่ภายในตัวมันเอง ทุกอย่างจะทำงานเหมือนกับวัตถุดั้งเดิม

คุณยังสามารถสร้าง wrapper โดยใช้คำอธิบายประกอบ@Spy-

@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Spy
    List mockList = new ArrayList<String>();

    @Test
    public void whenMockAnnotation() {
        // these methods will work!
        mockList.add("one");
        mockList.add("two");
    }
}

ตัวอย่างโค้ดทั้งสองนี้เทียบเท่ากัน