Junit – 运行一次设置的方法

我build立了一个testing的类,而不是使用@Before我想有一个设置方法,所有的testing只执行一次。 Junit 4.8有可能吗?

虽然我同意@assylias使用@BeforeClass是一个经典的解决scheme,但并不总是方便。 用@BeforeClass注释的方法必须是静态的。 一些需要testing用例的testing非常不方便。 例如,基于Spring的testing使用@Autowired来处理Spring上下文中定义的服务。

在这种情况下,我个人使用常规setUp()方法注释@Before注释和pipe理我的自定义boolean标志:

 private static boolean setUpIsDone = false; ..... public void setUp() { if (setUpIsDone) { return; } // do the setup setUpIsDone = true; } 

您可以使用BeforeClass注释 :

 @BeforeClass public static void setUpClass() { //executed only once, before the first test } 

JUnit 5现在有一个@BeforeAll注解:

表示注释的方法应该在当前类或类层次结构中的所有@Test方法之前执行; 类似于JUnit 4的@BeforeClass。 这样的方法必须是静态的。

JUnit 5的生命周期注释似乎终于得到了正确的结果! 您甚至可以猜测哪些注释是可用的(例如@BeforeEach @AfterAll)

setUp()处于实际testing的超类中时,接受的答案可以修改如下:

 public abstract class AbstractTestBase { private static Class<? extends AbstractTestBase> testClass; ..... public void setUp() { if (this.getClass().equals(testClass)) { return; } // do the setup - once per concrete test class ..... testClass = this.getClass(); } } 

这应该适用于一个非静态的setUp()方法,但是我无法为tearDown()生成一个等价物,而不会陷入复杂的reflection世界。奖金指向任何人都可以!

编辑:我只是在debugging时发现,在每次testing之前,类都被实例化了。 我猜@BeforeClass注释在这里是最好的。

你也可以在构造函数上设置,testing类毕竟一个类。 我不确定这是不是一个坏习惯,因为几乎所有其他的方法都被注释了,但它是有效的。 你可以创build一个像这样的构造函数:

 public UT () { // initialize once here } @Test // Some test here... 

Ctor将在testing之前被调用,因为它们不是静态的。

试试这个解决scheme: https : //stackoverflow.com/a/46274919/907576 :

使用@BeforeAllMethods / @AfterAllMethods注释,您可以在实例上下文中的Test类中执行任何方法,其中所有注入的值都可用。