用Mockito测试一个回调参数

时间:2014-10-20 20:21:40

标签: java junit mocking mockito

我在单元测试方面相当新,并且不知道如何在这个示例类的回调中测试以下环境:

public class Foo {

    private final ItemLoader loader;
    private Bar bar;

    public Foo(ItemLoader loader,Bar bar) {
        super();
        this.loader = loader;
        this.bar=bar;
    }

    public void getItems(ItemStore.Callback callback) {
        List<ItemData> itemData = bar.getItemData();
        List<Item> items = this.loader.transform(itemData);
        callback.onItemsLoaded(items);
    }

}
  • 使用loader.transform
  • 的结果调用callback.onItemsLoaded

我目前的测试是:

public class ExampleTest extends BaseTestCase {

    private Foo foo;

    @Mock
    private Bar mockBar;

    @Mock
    private ItemLoader mockItemLoader;

    @Mock
    private ItemStore.Callback itemLoadCallback;

    public void setUp() {
        MockitoAnnotations.initMocks(this);
        foo = new Foo(mockItemLoader, mockBar);
    }

    public void testGetItems() {
        List<ItemData> mockItemData = (List<ItemData>) mock(List.class);
        when(mockBar.getItemData()).thenReturn(mockItemData);
        foo.getItems(itemLoadCallback);
        verify(mockItemLoader).transform(mockItemData);
    }

}

它测试:

  • 称为loader.transform
  • 调用callback.onItemsLoaded

但是我意识到如果我改变Foo.getItems方法的最后一行(注意null):

    public void getItems(ItemStore.Callback callback) {
        ...
        callback.onItemsLoaded(null);
    }

测试保持不变。所以我需要测试使用loader.transform的结果调用callback.onItemsLoaded 所以我修改了测试:

    public void testGetItems() {
        List<ItemData> mockItemData = (List<ItemData>) mock(List.class);
        when(mockBar.getItemData()).thenReturn(mockItemData);
        foo.getItems(itemLoadCallback);
        verify(mockItemLoader).transform(mockItemData);
        List<Item> resultItems = verify(mockItemLoader).transform(mockItemData);
        verify(itemLoadCallback).onItemsLoaded(resultItems);
    }

但它在最后一行抱怨Argument(s) are different!

如何修复测试

1 个答案:

答案 0 :(得分:1)

因为mockItemLoader是模拟,它实际上会从transform返回一个空列表。如果你想让它返回不同的东西,你可以设置一个对象让它返回。基本上,这将是您自己的List<Item>。因此,您可以存根 tranform方法,而不是验证它;验证对List<Item>的调用时使用相同的onItemsLoaded