2012-11-05 24 views
9

在Spring組件中我有一個@PostConstruct語句。類似如下:如何在測試期間在Spring中禁用@PostConstruct

@Singleton 
@Component("filelist") 
public class FileListService extends BaseService { 

    private List listOfFiles = new Arrays.list(); 

    //some other functions 


    @PostConstruct 
    public void populate() { 

     for (File f : FileUtils.listFiles(new File(SystemUtils.JAVA_IO_TMPDIR), new String[]{"txt"},true)){ 
      listOfFiles.add(f.getName()); 
     } 
    } 

    @Override 
    public long count() throws DataSourceException { 
     return listOfFiles.size(); 
    } 

    // more methods ..... 
} 

在單元測試我不希望有@PostConstruct函數調用,是有沒有辦法告訴春天不要做後期處理?或者是否有更好的註釋來調用非測試類的啓動方法?

+0

它是FileListService你想測試或取決於它的其他類嗎? – mrembisz

+0

正在測試的Web服務需要FileListService - 公共類FileWSTest擴展了正在使用灰熊Web容器的JerseyTest – Ben

+3

您可以使用子類來模擬它,也可以將初始化部分分解出來。您可以將模擬程序放在掃描僅用於測試的包中,並將其標記爲'@ Primary'。 – mrembisz

回答

4

由於您沒有測試FileListService,而是依賴類,您可以模擬它進行測試。在一個單獨的測試包中製作一個模擬版本,該測試包僅通過測試環境進行掃描。標記爲@Primary註釋,因此它優先於生產版本。

4

任何的:在您的測試,並覆蓋到什麼也不做的方法(如mrembisz說,你就需要將掃描在包中的子類只爲測試和標記爲@Primary

  1. 子類FileListService
  2. 變化FileListService所以文件的列表被Spring(這是一個更清潔的設計反正),並在測試中注入,注入一個空列表
  3. 只是new FileListService()創建和你自己注入的依賴
  4. 使用不同的配置文件/類來啓動Spring,而不使用註釋配置。
+0

FileListService是一個@Component,它是由Spring使用找到的,所以重寫不會阻止Spring找到它。另外一些PostConstruct實際上會做其他事情,所以我需要注入一個函數而不是數據。我想我會需要一種注入Mocked類的方法來覆蓋現有的bean-id – Ben

相關問題