【问题标题】:TDD: how to verify method calls made from a list of objects in Java? [closed]TDD:如何验证从 Java 中的对象列表进行的方法调用? [关闭]
【发布时间】:2013-03-18 17:31:46
【问题描述】:

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

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

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

3) 它应该从最终的辅助类 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) 等),而不是它的对象。

知道我该怎么做吗?

【问题讨论】:

    标签: java junit tdd mockito


    【解决方案1】:

    我在发布问题之前找到了答案。其实很简单。

    首先,您需要使用 Mockito 模拟您将拥有的对象:

    final BlockController mockedBlock = mock(BlockController.class);
    

    接下来,使用您的模拟对象创建列表(下面我创建了一个包含 3 个 BlockController 类型的模拟对象的列表):

    List<BlockController> myBlockList = Arrays.asList(mockedBlock, mockedBlock, mockedBlock);
    

    在调用方法之前,将测试类中的列表设置为模拟对象列表:

    fileGenerator.setBlockList(myBlockList);
    fileGenerator.generateBlocks();
    

    现在,使用 Mockito,只需验证对 bar 方法的调用次数是否与您的 List 的大小匹配:

    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();
    }
    

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

    【讨论】:

      猜你喜欢
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多