在我使用JUnit4.8.2的时候,有以下发现。
测试的场景是这样的:在@Before方法中,会执行创建表(hsqldb memory db)的操作(之所以不使用@BeforeClass来做这件事,是因为创建数据库的操作必须要使用到被容器(Spring)注入进来的DataSource对象,而实例变量是无法在static的@BeforeClass方法中使用的),在每个@Test方法里面执行不同的代码,验证数据库操作的正确性。为了防止每个@Test方法执行之前,重复执行创建数据库的操作,我在test类里面定义一个实例变量,当第一次@Before方法创建好数据表之后就将其设置为true,每次执行前判断false才执行操作:
1 | private boolean isTableCreated = false; |
但是实际运行的时候,还是会报数据表已经存在的错误。但是我把变量改为:
1 | private static boolean isTableCreated = false; |
就没有问题了。这只能说明:在JUnit执行一个类中不同的@Test方法时,它是生成了若干个instances来做的(看起来像是为每一个@Test方法生成一个instance),而不是使用一个instance实例重复使用。
我查到一个Martin Fowler的文章,证实了我的想法。