gpt4 book ai didi

java - 如何替换JUNIT5中的@Rule

转载 作者:行者123 更新时间:2023-12-03 08:00:36 28 4
gpt4 key购买 nike

我想在 JUNIT 5 中转换这段代码而不使用 @Rule。我尝试了 JUINT 5 TestWatcher 但它没有启动方法。尝试过 this 但无法理解如何实现 ExtendWith 或 Extension

 @Rule
public TestWatcher watchman = new TestWatcher() {

@Override
public void starting(final Description description) {
logger.info("STARTING test: " + description.getMethodName());
}
};

最佳答案

有关 JUnit 5 的更多信息,我建议阅读 JUnit 5 User Guide .


在 JUnit 5 中,如果您想在每次测试之前执行一个方法,那么您可以使用 @BeforeEach注解。要获取有关要执行的测试的信息,您可以为该方法指定 TestInfo参数将自动为您注入(inject)。例如:

import java.lang.reflect.Method;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
// import logger...

class XXXTests {

final Logger logger = ...;

@BeforeEach
void logStartOfTest(TestInfo info) {
logger.info("STARTING test: " + info.getMethod().map(Method::getName).orElse(null));
}

@Test
void testFoo() {
// perform assertions
}
}

如果您不想为每个测试都编写该内容,那么您可以创建自己的扩展来实现 BeforeEachCallback 。例如:

import java.lang.reflect.Method;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
// import logger..

public class MyExtension implements BeforeEachCallback {

final Logger logger = ...;

@Override
public void beforeEach(ExtensionContext context) {
logger.info("STARTING test: " + context.getTestMethod().map(Method::getName).orElse(null));
}
}

然后应用您的扩展:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(MyExtension.class)
class XXXTests {

@Test
void testFoo() {
// perform assertions
}
}

您的扩展类可以实现多个扩展接口(interface)。如果你想观察成功和失败,那么你也可以实现 org.junit.jupiter.api.extension.TestWatcher ,但请注意,该接口(interface)仅在 JUnit 5.7 中才成为稳定的 API(我相信它是在 5.4 版本中添加的)。

关于java - 如何替换JUNIT5中的@Rule,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74393012/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com