5.1 คำอธิบายประกอบ @ParameterizedTest

บางครั้งคุณแค่ต้องการเรียกการทดสอบหลายๆ ครั้งด้วยพารามิเตอร์ที่แตกต่างกัน: ค่าที่แตกต่างกัน, พารามิเตอร์อินพุตที่แตกต่างกัน, ชื่อผู้ใช้ที่แตกต่างกัน JUnit มีจุดมุ่งหมายเพื่อทำให้ชีวิตของคุณง่ายขึ้น ดังนั้นสำหรับกรณีนี้ จึงมีการทดสอบแบบพารามิเตอร์

หากต้องการใช้การทดสอบแบบกำหนดพารามิเตอร์ คุณต้องเพิ่มการพึ่งพาอีกหนึ่งอย่างให้กับpom.xml:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

จากนั้นเราจะพิจารณาตัวอย่าง:

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethod(int argument) {
    //test code
}

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

วิธีการทดสอบแต่ละวิธีจะถูกเรียกใช้ 3 ครั้ง และทุกครั้งที่เรียกใช้ จะมีการส่งพารามิเตอร์อื่นไปให้ ค่าถูกตั้งค่าโดยใช้คำอธิบายประกอบอื่น- @ValueSource แต่ต้องมีการพูดเพิ่มเติมเกี่ยวกับเรื่องนี้

5.2 คำอธิบายประกอบ @ValueSource

คำอธิบายประกอบ@ValueSourceนั้นยอดเยี่ยมสำหรับการทำงานกับคำดั้งเดิมและตัวอักษร เพียงแสดงรายการค่าพารามิเตอร์ที่คั่นด้วยเครื่องหมายจุลภาคและการทดสอบจะถูกเรียกหนึ่งครั้งสำหรับแต่ละค่า

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

แต่ยังมีข้อเสีย - คำอธิบายประกอบนี้ไม่รองรับค่า Null ดังนั้นคุณจะต้องใช้ไม้ค้ำพิเศษสำหรับมัน- @NullSource ดูเหมือนว่า:

@ParameterizedTest
@NullSource
void testMethodNullSource(Integer argument) {
    assertTrue(argument == null);
}

5.3 คำอธิบายประกอบ @EnumSource

นอกจากนี้ยังมีคำอธิบายประกอบพิเศษ@EnumSourceซึ่งส่งผ่านค่าทั้งหมดของ Enum เฉพาะไปยังเมธอด แอปพลิเคชันมีลักษณะดังนี้:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

@ParameterizedTest
@EnumSource(Direction.class)
void testWithEnumSource(Direction d) {
    assertNotNull(d);
}

5.4 คำอธิบายประกอบ @MethodSource

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

ตัวอย่าง:

@ParameterizedTest
@MethodSource("argsProviderFactory")
void testWithMethodSource(String argument) {
    assertNotNull(argument);
}

static Stream<String> argsProviderFactory() {
    return Stream.of("one", "two",  "three");
}

การทดสอบพารามิเตอร์ด้วยอาร์กิวเมนต์หลายตัว

แน่นอนคุณเคยสงสัยแล้วว่าจะทำอย่างไรถ้าคุณต้องการส่งพารามิเตอร์หลายตัวไปยังเมธอด มี คำอธิบายประกอบ @CSVSource ที่ยอดเยี่ยมสำหรับสิ่ง นี้ ช่วยให้คุณแสดงรายการค่าของพารามิเตอร์เมธอดโดยคั่นด้วยเครื่องหมายจุลภาค

ตัวอย่าง:

@ParameterizedTest
@CsvSource({
    "alex, 30, Programmer, Working",
    "brian, 35, Tester, Working",
	"charles, 40, manager, kicks"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
	//method code
}