2017-09-01 119 views
0

我有這樣一個類:Mock對象並將其分配給實例和靜態變量的方法

// This class will process the incoming flat files from various data sources 
public class FileProcessor { 

    private String fileName;//Say filetype_datasource_yyyyMMddHHmmss.dat 
    private String fileType; 
    private String fileNameWithoutExtension; 
    private String fileSource; 
    private String timestamp; 
    private boolean validFileName; 
    private static final Logger logger = Logger.getLogger(FileProcessor.class); 

    public FileProcessor(String fileName) { 
     this.fileName = fileName; 
    } 

    public void validateFileName() { 
     fileNameWithoutExtension = fileName.substring(0, fileName.indexOf(".")); 
     String[] fileNameSplit = fileName.split("_"); 
     fileType = fileNameSplit[0]; 
     logger.info("File type: " + fileType); 
     fileSource = fileNameSplit[1]; 
     logger.info("File source: " + fileSource); 
     timestamp = fileNameSplit[2]; 
     logger.info("File timestamp: " + timestamp); 
     validFileName = validateFileType() && validateFileSource() && validateTimestamp(); 
    } 

    private boolean validateFileType() { 
     boolean result; 
     //Validate as per business rules 
     ... 
     return result; 
    } 

    private boolean validateFileSource() { 
     boolean result; 
     //Validate as per business rules 
     ... 
     return result; 
    } 

    private boolean validateTimestamp() { 
     boolean result; 
     //Validate as per business rules 
     ... 
     return result; 
    } 
} 

這裏美中不足的是,validateFileName()使用了一些實例變量(fileNameWithoutExtension, fileType, fileSource, timestamp, validFileName),和一個靜態變量(logger )。

是編寫JUnit測試案例嘲諷分配給該方法validateFileName()使用的實例和靜態變量的對象的最佳方式?

我是Junit和對象嘲笑的初學者,並且可以使用任何解決問題的模擬框架。謝謝。

+2

你的類沒有任何依賴關係(也許除了記錄器,但我想你不想測試班級記錄的內容)。沒有什麼可以嘲笑的。只需創建一個類的實例,調用該方法,並查看它是否產生預期的結果。 –

回答

1

所有這些變量:

fileNameWithoutExtension, fileType, fileSource, timestamp, 
validFileName 

導出數據。
您可以從FileProcessor構造函數的單個依賴關係中獲取它們:String fileName參數。

但是即使String fileName也不應該嘲笑。它不是你想要隔離的依賴項。您希望它是一個真正的/普通的對象,因爲它構成了組件的輸入數據的一部分。

1

您不需要模擬字段,因爲它們都來自fileName,它來自構造函數的參數。

所以使用JUnit 4 - 假設你並不需要檢查什麼記錄,你可以簡單地做:

import org.junit.Assert; 
import org.junit.Test; 

// ... other imports 

public class FileProcessorTest { 

    @Test 
    public void test() { 
     // test a valid case 
     String file = "filetype_datasource_yyyyMMddHHmmss.dat"; 
     FileProcessor processor = new FileProcessor(file); 
     Assert.assertTrue(processor.validateFileType()); 
     // ... more assertions 

     // test where it should fail 
     file = "filetype_invalid_xxx.dat"; 
     processor = new FileProcessor(file); 
     Assert.assertFalse(processor.validateFileType()); 
     // ... more assertions 
    } 
} 
相關問題