2011-08-04 51 views
0

我一直在寻找关于如何使用我自己的注释来扩展JUnit4的资源。创建我自己的注释以扩展JUnit4行为

我希望能够定义一个@ExpectedProblem,我可以用它来标记我的一些测试。我已经看到网上似乎有一些关于如何扩展TestNG的资料,但是我没有任何可以扩展JUnit4的资料。

有没有人在这里扩展过JUnit4?

谢谢

+0

如果使用@ ExpectedProblem,你的意思是你期望测试失败,你可能会对JUnit @ Rule感兴趣,可在以下网址找到:https://github.com/ttsui/pending(免责声明:这是由我的同事)。 – Grundlefleck

+0

谢谢,但它在任何方面与待定测试无关,也不期望测试失败。我需要的东西实际上与@Test(期待=异常)类似,但只有一点不同。 –

回答

2

根据什么你想要你的注释做@ExpectedProblem,另一种选择是创建一个@Rule

这需要JUnit 4.7+,但应该比实现自己的Runner更简单。

例如,如果你想要一个注释说“这个测试应该抛出一个异常”,那么你会想看看@ExpectedException规则。即使这不足以满足您的需求,它也可以为实施您自己的规则提供一个很好的起点。

+0

规则似乎是一个不错的想法,直到我看到“这种方法优于规则的优点是规则总是作用域范围”@ http://stackoverflow.com/questions/6099633/does-testng-support-something-像-junit4s规则/ 6100111#6100111。我需要它们成为方法范围(我可能想要1个方法和我的注释,另一个没有它!)。 –

+0

@devoured elysium在您的方法规则中,您可以检查方法中是否存在任何特定的注释,并且如果注解缺失,让规则充当noop。 – Grundlefleck

+0

+1在Grundlefleck的评论 @devoured elysium这正是我所要做的 - 在调用我们感兴趣的注释时检查MethodRule的目标,并基于此修改测试执行。 –

1

基本的方法是创建你自己的类跑步者。例如,通过扩展org.junit.runners.ParentRunnerorg.junit.runners.BlockJUnit4ClassRunner类。然后你会用@RunWith(<your class runner>.class)注释你的测试类。在你的亚军,然后你可以分析测试类检查注释并采取适当措施等发现这个谷歌搜索:http://tedyoung.me/2011/01/23/junit-runtime-tests-custom-runners/

这是Spring是如何模仿他们的JUnit支持,使用org.springframework.test.context.junit4.SpringJUnit4ClassRunner

+0

谢谢!我只是想问你一些明显的问题:是不是有一种方法可以避免用笨拙的@RunWith()来污染我所有的测试方法? –

+0

不,AFAIK无法全局配置跑步者。值得注意的是,JUnit本身建议在所有测试类上始终使用@RunWith注释以确保未来的校样。如果你的测试类是一个JUnit 4测试,它应该被注释@RunWith(JUnit4.class)。除非另有说明,当前版本(JUnit 4)默认为BlockJUnit4ClassRunner。 – pap