我的测试类中的所有测试在@Before
执行每个测试之前都会执行一个“之前”方法(用 JUnit 注释)。
我需要一个特定的测试来不执行这个之前的方法。
有没有办法做到这一点?
您可以使用TestRule来做到这一点。你用一些描述的注释标记你想要跳过的测试,然后,在 TestRule 的 apply 方法中,你可以测试那个注释并做你想做的事情,比如:
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
if (description.getAnnotation(DontRunBefore.class) == null) {
// run the before method here
}
base.evaluate();
}
};
}
考虑使用@Enclosed
运行器来允许您拥有两个内部测试类。一个有所需的@Before
方法,另一个没有。
@RunWith(Enclosed.class)
public class Outer{
public static class Inner1{
@Before public void setup(){}
@Test public void test1(){}
}
public static class Inner2{
// include or not the setup
@Before public void setup2(){}
@Test public void test2(){}
}
}
不幸的是,您必须编写此逻辑。JUnit 没有这样的特性。通常你有2个解决方案:
@RequiresBefore
并使用此注释标记需要此注释的测试。测试运行器将解析注释并决定是否运行“之前”方法。第二种解决方案更清晰。第一个比较简单。这取决于您选择其中之一。
这个问题已经被问过一段时间了,不过,我想分享我的解决方案:
注释所需的方法@Tag("skipBeforeEach")
在您的 setup() 方法中:
@BeforeEach
void setup(final TestInfo info) {
final Set<String> testTags = info.getTags();
if(testTags.stream()
.filter(tag->tag.equals("skipBeforeEach"))
.findFirst()
.isPresent()){
return;
}
// do your stuff
}```
@Before
也可以通过撤消在测试用例中的设置中所做的事情来解决这个问题。这可能是它的样子,
@Before
public void setup() {
TestDataSetupClass.setupTestData();
}
@Test
public void testServiceWithIgnoreCommonSetup() {
TestDataSetupClass.unSet();
//Perform Test
}
这里的解决方案有利有弊。次要缺点是设置和取消设置步骤的不必要循环。但是如果一个人只需要为数百个测试用例做这件事,并且避免编写自己的 AOP 或维护多个内部测试类的开销,那就很好了。
我一直在寻找这个问题的解决方案并遇到了这个问题。作为更新,在 JUnit 5 中,现在可以使用@Nested 注释轻松完成此操作。
如果您使用的是 Mockito,尤其是 Mockito 3.0,则所有存根都将是“严格的”并且默认情况下会被验证。
您可以使用 Mockito lenient() 方法。
更多信息:https ://www.baeldung.com/mockito-unnecessary-stubbing-exception#lenient-stubbing
如果你有一个@After 方法可以清除@Before 中所做的工作,你可以在@Test 方法的开头手动调用@After 方法。