2013-03-18 63 views
-2

我有一個類FileGenerator,我正在寫一個測試應該做generateFile()方法如下:TDD:如何驗證從Java對象列表中進行的方法調用?

1)它應該調用靜態方法getBlockImpl(FileTypeEnum)上BlockAbstractFactory

2 )應該從子類方法getBlocks填充可變塊列表()

3)它應該從一個最終輔助類FileHelper傳遞字符串參數

4)調用靜態方法的CreateFile它應該調用每個運行方法BlockList中的BlockController

我正在嘗試使用TDD來測試我的方法的最後一個場景。我有一個實現Runnable的BlockController對象列表,我需要驗證每個對象是否調用run()方法。

這裏就是我想要做的事:

public class FileGenerator { 
// private fields with Getters and Setters 

    public void generateBlocks() { 
     // 1,2 get the block manager that will return the BlockController list 
     blockManager = BlockAbstractFactory.getManager(fileType); 
     blockList = blockManager.getBlocks(); 
     // create a file using FileHelper 
     FileHelper.createFile(path); 

     // What I want to test: 
     // for each BlockController in the blockList, call the run() method 
    } 
} 

我使用JUnit和的Mockito。在Mockito的文檔中,他們只展示瞭如何模擬列表並驗證List上的方法調用(如add(T),remove(T)等),而不是其對象。

任何想法我可以做到這一點?

回答

1

我在發佈問題之前找到了答案。其實很簡單。

首先,你需要模擬你已經使用了的Mockito對象:

final BlockController mockedBlock = mock(BlockController.class); 

下,使用您的嘲笑對象創建列表(下面我有創造型BlockController的3個嘲笑對象的列表) :

List<BlockController> myBlockList = Arrays.asList(mockedBlock, mockedBlock, mockedBlock); 

設置列表中的測試類來嘲笑的對象列表調用方法前:

fileGenerator.setBlockList(myBlockList); 
fileGenerator.generateBlocks(); 

現在,隨着的Mockito,只是驗證,如果調用的杆法的數量列表的大小相匹配:

verify(myBlockList, times(myBlockList.size())).run(); 

這是什麼樣子到底(我FileGenerator對象是在創建@之前的方法):

@Test 
public testShouldCallRunForEachBlock() { 
    final BlockController mockedBlock = mock(BlockController.class); 
    List<BlockController> myBlockList = Arrays.asList(mockedBlock, mockedBlock, mockedBlock); 

    fileGenerator.setBlockList(myBlockList); 
    fileGenerator.generateBlocks(); 

    verify(myBlockList, times(myBlockList.size())).run(); 
} 

就是這樣。現在測試將會失敗,直到執行一個循環。

相關問題