-2

クラス FileGenerator があり、次のことを行う generateFile() メソッドのテストを作成しています。

1) BlockAbstractFactory で静的メソッド getBlockImpl(FileTypeEnum) を呼び出す必要があります

2) サブクラス メソッド getBlocks() から変数 blockList を設定する必要があります。

3) String パラメーターを渡して、最終ヘルパー クラス FileHelper から静的メソッド createFile を呼び出す必要があります。

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 のドキュメントでは、オブジェクトではなく、リストをモックし、リストのメソッド呼び出し (add(T)、remove(T) など) を検証する方法のみを示しています。

どうすればこれを行うことができますか?

4

1 に答える 1

1

質問を投稿する前に答えを見つけました。それは実際には非常に簡単です。

まず、Mockito を使用してオブジェクトをモックする必要があります。

final BlockController mockedBlock = mock(BlockController.class);

次に、モック オブジェクトを使用してリストを作成します (以下では、BlockController タイプの 3 つのモック オブジェクトのリストを作成しています)。

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

以上です。これで、ループが実装されるまでテストは失敗します。

于 2013-03-18T17:31:46.027 に答える