我有一個在這個問題同樣的問題:在Spring測試中@Test方法之前僅填充一次數據庫?
How to populate database only once before @Test methods in spring test?
但解決的辦法是不能接受我,因爲這將運行我的所有測試類相同的腳本。 我想要的是隻爲每個測試類運行一次不同的腳本。 我目前找到的唯一解決方案是在@Before方法中添加一個if
我有一個在這個問題同樣的問題:在Spring測試中@Test方法之前僅填充一次數據庫?
How to populate database only once before @Test methods in spring test?
但解決的辦法是不能接受我,因爲這將運行我的所有測試類相同的腳本。 我想要的是隻爲每個測試類運行一次不同的腳本。 我目前找到的唯一解決方案是在@Before方法中添加一個if
註釋@BeforeClass
允許爲一組測試運行初始化代碼。這是從javadoc的摘錄:
有時幾個測試需要共享計算昂貴的安裝 (如登錄到數據庫)。雖然這可能會影響測試的獨立性,但有時候這是一種必要的優化。 使用@BeforeClass註釋公共靜態void no-arg方法會導致 它會在類中的任何測試方法之前運行一次。超類的@BeforeClass方法將在當前類的 之前運行。
除非你願意有一個不同的ApplicationContext
加載(和緩存)每個測試(見下文),你唯一的選擇是定義一個static boolean
場,並設置它在一個@Before
方法填充數據庫,如果它是班上第一次參加。我想這就是你在@Before
方法中使用if
的含義。
現在,如果您願意爲每個測試類別加載不同的ApplicationContext
,則可以爲給定的測試類別定義填充數據庫的唯一@Configuration
類或XML配置文件。然後,您可以標註您的測試類,如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/standard-test-config.xml", "TestClass1-config.xml" })
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TestClass1 {/* ... */ }
或
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StandardTestConfig.class, TestClass1.Config.class })
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TestClass1 {/* ... */ }
然後,您可以在@Configuration
類使用<jdbc:embedded-database ...>
或<jdbc:initialize-database ...>
XML或EmbeddedDatabaseBuilder
或ResourceDatabasePopulator
(與DatabasePopulatorUtils
)。
當然,像這樣爲每個測試類加載不同的ApplicationContext
可能會極大地降低測試套件的速度,尤其是如果ApplicationContext
需要很長時間才能加載。所以你需要考慮到這一點。
問候,
山姆
'@ BeforeClass'通常不是一種選擇使用_Spring的TestContext Framework_時,因爲你不會有在'@BeforeClass從'ApplicationContext'訪問'DataSource' '方法。 –