Tags:

@DisplayName Annotation JUnit 5

Trong JUnit 5, chúng ta có thể sử dụng @DisplayName để tuỳ biến tên cho test class và test method. 

Default name

Mặc định tên của test class và test method trong kết quả thực thi unit test sẽ trùng với tên khai báo trong mã code.

package displayname;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertTrue;

public class DisplayNameExample {

    @Test
    public void testStringBlank() {
        String input = "test";
        assertTrue(input != null && input != "");
    }
}

display name default

Custom test class và test method name

Sử dụng @DisplayName để đặt tên cho test class và test method sẽ làm cho kết quả thực thi unit test khả quan hơn với tên tường mình do chúng ta đặt.

package displayname;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertTrue;

@DisplayName("DisplayName example")
public class DisplayNameExample {

    @Test
    @DisplayName("Test String blank")
    public void testStringBlank() {
        String input = "test";
        assertTrue(input != null && input != "");
    }
}

Display name Generators

Chúng ta cũng có thể custom tên được generate bởi JUnit với @DisplayNameGenetation.

Mặc định JUnit sẽ lấy tên được khai báo trong mã code sử dụng trong kết quả thực thi unit test, giờ chúng ta sẽ thay thế các dấu “_” bằng 1 khoảng trắng.

package displayname;


import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class DisplayNameGeneratorExample {

    @Test
    void test_spaces_ok() {
    }

    @Test
    void test_spaces_fail() {
    }

}

DisplayNameGenerator

Ngoài ra, chúng ta có thể tạo một DisplayNameGenerator class tuỳ biến theo ý muốn 

package displayname;


import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.stream.Collectors;

@DisplayNameGeneration(CustomDisplayGenerator.CustomDisplayNameGenerator.class)
public class CustomDisplayGenerator {

    @Test
    void test_spaces_ok() {
    }

    @Test
    void test_spaces_fail() {
    }

    static class CustomDisplayNameGenerator extends DisplayNameGenerator.Standard {

        @Override
        public String generateDisplayNameForClass(Class<?> testClass) {
            return "New Name for test class";
        }

        @Override
        public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
            return super.generateDisplayNameForNestedClass(nestedClass);
        }

        @Override
        public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
            String name = testMethod.getName();
            return Arrays.stream(name.split("_")).collect(Collectors.joining(" | "));
        }
    }

}
C

CustomDisplayGenerator

ParameterizedTest Name

@ParameterizedTest cho phép thực thi một test method nhiều lần với các tham số đầu vào được cung cấp bởi nó. 

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

import static org.junit.jupiter.params.provider.Arguments.arguments;

public class DisplayNameParamTest {

    @ParameterizedTest(name = "#{index} - Test with TimeUnit: {0}")
    @EnumSource(value = TimeUnit.class, names = {"MINUTES", "SECONDS"})
    void test_timeunit_ok(TimeUnit time) {
    }


    @ParameterizedTest(name = "#{index} - Test with {0} and {1}")
    @MethodSource("argumentProvider")
    void test_method_multi(String str, int length) {
    }

    static Stream<Arguments> argumentProvider() {
        return Stream.of(
                arguments("abc", 3),
                arguments("lemon", 2)
        );
    }

}


ParameterizedTestName

Các ràng buộc giá trị cần chú ý:

  • {index}: Lần thực thi thứ index.
  • {int value}: Giá trị tham số đầu vào tại vị trí value.

Tóm lược

Như vậy chúng ta đã tìm hiểu xong về @DisplayName trong JUnit 5, nó là một anntation khá dễ sử dụng trong Junit 5 giúp kết quả báo cáo trực quan hơn với tên mà chúng ta định nghĩa.

Nếu các bạn gặp khó khăn trong quá trình thực nghiệm, có thể checkout source mình đã soạn sẵn tại github repository.

Nguồn tham khảo

https://mkyong.com/junit5/junit-5-display-names/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x