我有一个类FileGenerator,我正在为generateFile()方法写一个测试,它应该做以下事情:
1)它应该在BlockAbstractFactory上调用静态方法getBlockImpl(FileTypeEnum)
2)它应该从子类方法getBlocks()中填充变量blockList
3)它应该从最终的helper类FileHelper中调用一个静态方法createFile,传递一个String参数
4)它应该调用blockList
中每个BlockController的run方法我正在尝试使用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和验证List上的方法调用(如add(T), remove(T)等),而不是它的对象。
你知道我该怎么做吗?
我在发布问题之前找到了答案。这其实很简单。
首先,您需要使用Mockito模拟您将要拥有的对象:
final BlockController mockedBlock = mock(BlockController.class);
接下来,使用你的模拟对象创建列表(下面我创建了一个包含3个类型为BlockController的模拟对象的列表):
List<BlockController> myBlockList = Arrays.asList(mockedBlock, mockedBlock, mockedBlock);
在调用方法之前,将测试类中的列表设置为模拟对象的列表:
fileGenerator.setBlockList(myBlockList);
fileGenerator.generateBlocks();
现在,使用Mockito,只需验证bar方法的调用次数是否与列表的大小匹配:
verify( myBlockList, times(myBlockList.size()) ).run();
这是它最后的样子(我的FileGenerator对象是在@Before方法中创建的):
@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();
}
就是这样。现在测试将失败,直到实现循环。