如何在每个JUnit @Test方法之前单独运行一些代码,而不使用@RunWith或AOP



用例很简单:我想在JUnit测试中用@Test 我的自定义注释(我们称之为@Mine)注释的每个方法之前运行一些模板代码。

我不想使用以下方法(括号中的解释):

  1. @RunWith(我的测试可能,也可能不使用这个注释,所以我不能假设我将能够使用我自己的运行器)
  2. AOP(我不能使任何依赖第三方库,如AspectJ)

我想这只会让我反思,这对我来说很好。我想使用@Before伴随着通过Thread.getCurrentThread()等获取当前方法,但不知何原因,我发现这个解决方案有点脏,因为我必须在这个方法中再次制作锅炉板代码来触发反射(避免任何不必要的代码是首要目标)。

也许你有其他的想法?

您需要一个非常类似于基于TestRule将单元测试标记为预期失败的答案的解决方案。使用@Deprecated注释的示例(您可以在这里使用您的注释),如果注释存在于方法上,则可以插入代码。Description类包含该方法的注释列表。

public class ExecutionTest {
    public class BeforeExecution implements TestRule {
        public Statement apply(Statement base, Description description) {
            return statement(base, description);
        }
        private Statement statement(final Statement base, final Description description) {
            return new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    if (description.getAnnotation(Deprecated.class) != null) {
                        // you can do whatever you like here.
                        System.err.println("this will be run when the method has an @Deprecated annotation");
                    }
                    base.evaluate();
                }
            };
        }
    }
    @Rule public BeforeExecution beforeExecution = new BeforeExecution();
    // Will have code executed.
    @Deprecated
    @Test public void test1() {
         // stuff
    }
    // won't have code executed.
    @Test public void test2() {
         // stuff
    }
}

我会把这个类分成两个。一个用于您用@mine注释的方法,另一个用于其他方法。

则正常使用@before。

这没有添加任何标准代码,并且对于未来的开发人员来说也很容易理解和维护。

相关内容

  • 没有找到相关文章

最新更新