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类中执行任何方法,其中所有注入的值都可用。