测试接口

重要性:★★★☆☆

从Java 8开始,可以在接口上定义默认方法和静态方法,包含实现代码。

JUnit Jupiter允许在接口的默认方法上声明@Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate, @BeforeEach, 和@AfterEach注解,在接口的静态方法上声明 @BeforeAll@AfterAll 注解。如果采用PER_CLASS生命周期的话,也可以在接口的默认方法上声明 @BeforeAll@AfterAll 注解。实现这些接口的测试方法将继承这些方法和注解。

注解@Tag@ExtendWith也可以声明在接口上,由实现这些接口的测试类继承。

下面的代码创建一个TestLifecycleLogger接口,定义了生命周期相关方法。

package yang.yu.tdd.iface;

import org.junit.jupiter.api.*;

import java.util.logging.Logger;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
interface TestLifecycleLogger {

    static final Logger logger = Logger.getLogger(TestLifecycleLogger.class.getName());

    @BeforeAll
    default void beforeAllTests() {
        logger.info("Before all tests");
    }

    @AfterAll
    default void afterAllTests() {
        logger.info("After all tests");
    }

    @BeforeEach
    default void beforeEachTest(TestInfo testInfo) {
        logger.info(() -> String.format("About to execute [%s]",
                testInfo.getDisplayName()));
    }

    @AfterEach
    default void afterEachTest(TestInfo testInfo) {
        logger.info(() -> String.format("Finished executing [%s]",
                testInfo.getDisplayName()));
    }
}

下面的代码创建TestInterfaceDynamicTestsDemo接口,定义了注解为@TestFactory的动态测试生成方法dynamicTestsForPalindromes()

package yang.yu.tdd.iface;

import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;

import java.util.stream.Stream;

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

interface TestInterfaceDynamicTestsDemo {

    @TestFactory
    default Stream<DynamicTest> dynamicTestsForPalindromes() {
        return Stream.of("racecar", "radar", "mom", "dad")
                .map(text -> dynamicTest(text, () -> assertTrue(isPalindrome(text))));
    }

    static boolean isPalindrome(String raw) {
        String str = "";
        for (int i = 0; i < raw.length(); i++) {
            char ch = raw.charAt(i);
            if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
                str += ch;
            }
        }
        str = str.toLowerCase();
        int end = str.length();
        for (int i = 0; i < end / 2; i++) {
            if (str.charAt(i) != str.charAt(end - i - 1)) {
                return false;
            }
        }
        return true;
    }
}

下面的代码创建测试类TestInterfaceDemo,它继承了上面的几个接口:

package yang.yu.tdd.iface;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class TestInterfaceDemo implements TestInterfaceDynamicTestsDemo, TestLifecycleLogger {
    @Test
    void isEqualValue() {
        assertThat("a".length()).as("is always equal").isEqualTo(1);
    }
}

当测试类TestInterfaceDemo执行时,它所实现的各个接口上定义的测试方法、生命周期方法、测试工厂方法也会执行,就如同这些方法是直接定义在测试类上面一样。

results matching ""

    No results matching ""