Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TDD:如何在Java中验证从对象列表发出的方法调用?_Java_Junit_Tdd_Mockito - Fatal编程技术网

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

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来测

我有一个类FileGenerator,我正在为generateFile()方法编写一个测试,它应该执行以下操作:

1) 它应该在BlockAbstractFactory上调用静态方法getBlockImpl(FileTypeEnum)

2) 它应该从子类方法getBlocks()填充变量blockList

3) 它应该从传递字符串参数的最终帮助器类FileHelper调用静态方法createFile

4) 它应该调用块列表中每个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的文档中,它们只显示了如何模拟列表并验证列表上的方法调用(如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();
}