我的测试类中的所有测试都会在执行每个测试之前执行'before'方法(使用JUnit的@Before
注释)。
我需要一个特定的测试,不要在方法之前执行它。
有办法吗?
答案 0 :(得分:21)
您可以使用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();
}
};
}
答案 1 :(得分:16)
考虑使用@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(){}
}
}
答案 2 :(得分:10)
不幸的是你必须编写这个逻辑代码。 JUnit没有这样的功能。 通常,您有两种解决方案:
@RequiresBefore
并使用此注释标记需要此注释的测试。测试运行器将解析注释并决定是否运行“之前”方法。第二种解决方案更清晰。第一个更简单。这取决于你选择其中一个。
答案 3 :(得分:0)
还可以通过撤消在测试用例中@Before
设置中所执行的操作来解决此问题。
这就是它的外观,
@Before
public void setup() {
TestDataSetupClass.setupTestData();
}
@Test
public void testServiceWithIgnoreCommonSetup() {
TestDataSetupClass.unSet();
//Perform Test
}
这里的解决方案有利有弊。对此的轻微con,是不必要的设置和取消设置步骤的循环。但是如果只需要为数百个测试用例做这件事就可以了,并避免编写自我AOP或维护多个内部测试类的开销。
答案 4 :(得分:0)
我一直在寻找解决这个问题的方法,然后碰到了这个问题。作为更新,在JUnit 5中,现在可以使用@Nested annotation来轻松实现这一点。
答案 5 :(得分:0)
如果您使用的是Mockito,尤其是Mockito 3.0,则所有存根都将是“严格的”,并且默认情况下会得到验证。
您可以使用Mockito lenient()方法。
更多内容:https://www.baeldung.com/mockito-unnecessary-stubbing-exception#lenient-stubbing