2016-01-05 51 views
2

我正在爲我的Spring Boot(1.3.1)應用程序設置集成測試。在上下文啓動我的應用程序從一個數據目錄,這在生產application.properties提供讀取它的狀態:從TestExecutionListener向ApplicationContext添加屬性

datadir.location=<path to directory> 

現在,如果我只是想在我的測試中使用一個固定的目錄,我可以用@TestPropertySource像這樣:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MyApplication.class) 
@WebIntegrationTest({"server.port=0", "management.port=0"}) 
@TestPropertySource(properties = {"datadir.location=<path to test data directory>"}) 
public class MyIntegrationTest { 
} 

不過,我想生成測試的測試數據,所以我成立了一個以TestExecutionListener的創建一個臨時目錄,並添加測試數據。測試現在看起來是這樣的:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MyApplication.class) 
@WebIntegrationTest({"server.port=0", "management.port=0"}) 
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) 
@TestExecutionListeners(listeners = {DataDirSetupListener.class}, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) 
public class MyIntegrationTest { 

    public void initDataDirectory(Path pathToDataDir) { 
     // Setup of contents in temporary data directory goes here 
    } 
} 

的TestExecutionListener的是這樣的:

public class DataDirSetupListener extends AbstractTestExecutionListener { 

    public void beforeTestClass(TestContext testContext) { 
     Path tempDataDir = Files.createTempDirectory("datadir"); 

     // This call asks testContext for the test class, and 
     // calls the initDataDirectory method 
     findAndCallInitDataDirectory(tempDataDir); 

     // TODO: Set datadir.location = tempDataDir.toString(); 
    } 

    public int getOrder() { 
     return Ordered.HIGHEST_PRECEDENCE; 
    } 
} 

所以,聽者運行良好並創建數據目錄帶來的ApplicationContext前了,但什麼是正確的提供數據目錄的位置到上下文的方式?

(如果移動的datadir安裝到prepareTestInstance代替beforeTestClass將有助於東西,這很好。)

回答

0

你可以使用Spring配置文件。因此,在試運行剖面測試和定義不同勢的應用性能每個配置文件

application-{profile}.properties 

Spring profile application properties

上seciton 24.4

+0

看我不知道如何將其應用到我的情況,作爲屬性值只有在DataDirSetupListener中的代碼已經運行時纔會知道。 –

+0

如何將數據填充到此DataDirSetupListener? – Aviad

+0

我更新了原帖。監聽器向TestContext詢問當前的測試類,並使用它來調用測試類中的initDataDirectory方法。 –