TDD:如何验证从Java对象列表中进行的方法调用?

问题描述:

我有一个类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)等),而不是其对象。

任何想法我可以做到这一点?

我在发布问题之前找到了答案。其实很简单。

首先,你需要模拟你已经使用了的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(); 
} 

就是这样。现在测试将会失败,直到执行一个循环。