Addev
Addev

Reputation: 32233

Test a callback param with Mockito

I'm pretty new in unit testing and dont know how to test the following circunstances over a callback for this example class:

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

}

My current test is:

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

}

It tests:

But I realised that if I change the last line of the Foo.getItems method like (Notice the null):

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

The test keep pasing. So I'd need to test that callback.onItemsLoaded is called with the result of loader.transform So I modified the test:

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

But it complains in the last line saying Argument(s) are different!

How can I fix the test

Upvotes: 1

Views: 278

Answers (1)

Dawood ibn Kareem
Dawood ibn Kareem

Reputation: 79818

Because mockItemLoader is a mock, it will actually return an empty list from transform. If you want to make it return something different, you could set up an object for it to return. Basically, this will be your own List<Item>. So you can then stub the tranform method instead of verifying it; and use the same List<Item> when you verify the call to onItemsLoaded.

Upvotes: 1

Related Questions