測試執行時動態獲取當前測試類名與方法名,用於:
[UserServiceTest#testLogin] 開始測試UserServiceTest_testLogin_failure.pngimport org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
public class SampleTest {
@Rule
public TestName name = new TestName();
@Test
public void testA() {
System.out.println("類名:" + name.getMethodName()); // 僅方法名
}
}
缺點:TestName 僅提供方法名,無類名。
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public class FullTestName implements TestRule {
private String fullName;
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
fullName = description.getClassName() + "." + description.getMethodName();
try {
base.evaluate();
} finally {
fullName = null; // 避免記憶體洩漏
}
}
};
}
public String getFullName() {
return fullName;
}
}
public class OrderServiceTest {
@Rule
public FullTestName testName = new FullTestName();
private TestLogger logger = new TestLogger();
@Test
public void testCreateOrder_success() {
logger.info("開始測試:" + testName.getFullName());
// 測試邏輯...
}
@Test
public void testCreateOrder_fail_invalidParam() {
logger.info("開始測試:" + testName.getFullName());
// 測試邏輯...
}
}
JUnit 5 原生支援 TestInfo 注入:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
class JUnit5Demo {
@Test
void testSomething(TestInfo testInfo) {
String displayName = testInfo.getDisplayName(); // 可自訂 @DisplayName
String className = testInfo.getTestClass().orElseThrow().getSimpleName();
String methodName = testInfo.getTestMethod().orElseThrow().getName();
System.out.println(className + "." + methodName + " | " + displayName);
}
}
JUnit 4 使用自訂 TestRule 封裝 Description 即可輕鬆獲取完整測試標識。遷移至 JUnit 5 後,直接注入 TestInfo 更簡潔且功能更強(支援顯示名稱、標籤、巢狀測試等)。