使用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);
    }
}
  • 调用该回调.onItemsLoaded时使用loader.transform的结果

我目前的测试是:

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被调用
  • 调用了该回调.onItemsLoaded

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

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

测试一直在进行。所以我需要测试回调。onItemsLoaded是用loader.transform的结果调用的所以我修改了测试:

    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!

如何修复测试

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

相关内容

  • 没有找到相关文章

最新更新