5.1 Chú thích @ParameterizedTest

Đôi khi bạn chỉ muốn gọi thử nghiệm nhiều lần với các tham số khác nhau: giá trị khác nhau, tham số đầu vào khác nhau, tên người dùng khác nhau. JUnit nhằm mục đích làm cho cuộc sống của bạn dễ dàng hơn, vì vậy trong trường hợp này, nó có một thứ như các bài kiểm tra được tham số hóa.

Để sử dụng các bài kiểm tra được tham số hóa, bạn cần thêm một phụ thuộc nữa vào pom.xml:

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

Sau đó, chúng ta có thể xem xét một ví dụ:

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

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

Mỗi phương thức thử nghiệm sẽ được gọi 3 lần và mỗi lần nó được gọi, một tham số khác sẽ được truyền cho nó. Các giá trị được đặt bằng chú thích khác - @ValueSource . Nhưng cần phải nói nhiều hơn về nó.

5.2 Chú thích @ValueSource

Chú thích @ValueSource rất phù hợp để làm việc với các nguyên hàm và nghĩa đen. Chỉ cần liệt kê các giá trị tham số được phân tách bằng dấu phẩy và phép thử sẽ được gọi một lần cho mỗi giá trị.

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

Nhưng cũng có một điểm trừ - chú thích này không hỗ trợ null, vì vậy bạn sẽ cần sử dụng một cái nạng đặc biệt cho nó - @NullSource . Nó trông như thế này:

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

5.3 Chú thích @EnumSource

Ngoài ra còn có một chú thích đặc biệt @EnumSource , nó chuyển tất cả các giá trị của một Enum cụ thể cho phương thức. Ứng dụng của nó trông như thế này:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 Chú thích @MethodSource

Nhưng làm cách nào để truyền đối tượng dưới dạng tham số? Đặc biệt nếu họ có một thuật toán xây dựng phức tạp. Để làm điều này, bạn chỉ cần chỉ định một phương thức trợ giúp đặc biệt sẽ trả về một danh sách (Luồng) các giá trị đó.

Ví dụ:

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

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

Các bài kiểm tra được tham số hóa với nhiều đối số

Tất nhiên, bạn đã tự hỏi phải làm gì nếu muốn truyền một số tham số cho phương thức. Có một chú thích @CSVSource rất thú vị cho điều này . Nó cho phép bạn liệt kê các giá trị của các tham số phương thức được phân tách đơn giản bằng dấu phẩy.

Ví dụ:

@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
}