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();
}
就是这样。现在测试将会失败,直到执行一个循环。