TDD:如何在Java中验证从对象列表发出的方法调用?
我有一个类FileGenerator,我正在为generateFile()方法编写一个测试,它应该执行以下操作: 1) 它应该在BlockAbstractFactory上调用静态方法getBlockImpl(FileTypeEnum) 2) 它应该从子类方法getBlocks()填充变量blockList 3) 它应该从传递字符串参数的最终帮助器类FileHelper调用静态方法createFile 4) 它应该调用块列表中每个BlockController的run方法 我正在尝试使用TDD来测试我的方法的最后一个场景。我有一个实现Runnable的BlockController对象列表,我需要验证是否每个对象都调用run()方法 以下是我想做的:TDD:如何在Java中验证从对象列表发出的方法调用?,java,junit,tdd,mockito,Java,Junit,Tdd,Mockito,我有一个类FileGenerator,我正在为generateFile()方法编写一个测试,它应该执行以下操作: 1) 它应该在BlockAbstractFactory上调用静态方法getBlockImpl(FileTypeEnum) 2) 它应该从子类方法getBlocks()填充变量blockList 3) 它应该从传递字符串参数的最终帮助器类FileHelper调用静态方法createFile 4) 它应该调用块列表中每个BlockController的run方法 我正在尝试使用TDD来测
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的文档中,它们只显示了如何模拟列表并验证列表上的方法调用(如add(T)、remove(T)等),而不是它的对象
知道我该怎么做吗?我在发布问题之前找到了答案。其实很简单 首先,您需要使用Mockito模拟您将拥有的对象:
final BlockController mockedBlock = mock(BlockController.class);
接下来,使用模拟对象创建列表(下面我创建了一个包含3个BlockController类型模拟对象的列表):
现在,使用Mockito,只需验证对bar方法的调用数量是否与列表大小匹配:
verify( myBlockList, times(myBlockList.size()) ).run();
这就是它最后的样子(我的FileGenerator对象是在@Before方法中创建的):
@测试
公共测试应调用RunForEachBlock(){
最终BlockController mockedBlock=mock(BlockController.class);
List myBlockList=Arrays.asList(mockedBlock、mockedBlock、mockedBlock);
fileGenerator.setBlockList(myBlockList);
fileGenerator.generateBlocks();
验证(myBlockList,times(myBlockList.size()).run();
}
就这样。现在,在实现a循环之前,测试将失败
fileGenerator.setBlockList(myBlockList);
fileGenerator.generateBlocks();
verify( myBlockList, times(myBlockList.size()) ).run();
@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();
}