TDD:如何验证从Java对象列表发出的方法调用



我有一个类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();
}

就是这样。现在测试将失败,直到实现循环。

相关内容

  • 没有找到相关文章

最新更新