我是单元测试的新手,不知道如何通过回调来测试这个示例类的以下循环:
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>
。