【问题标题】:Unit test RecyclerView Adapter Using Mockito使用 Mockito 对 RecyclerView 适配器进行单元测试
【发布时间】:2018-02-26 13:05:53
【问题描述】:

在 Recycler View Adapter 我有这个方法:

public void addGridItemsToView(int position, Tile data) {
    tileList.add(position, data);
    notifyItemInserted(position);
}

我想对此方法进行单元测试并检查是否调用了notifyItemInserted(position)

这是我的测试课:

public class AdapterTest  {
    @Mock
    private LiveZoneGridAdapter liveZoneGridAdapter;
    @Mock
    Context context;


    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void addGridItemsToViewNotifiesParentAndAddsItemToTileList() {
        liveZoneGridAdapter = spy(new LiveZoneGridAdapter(context));
        doNothing().when((RecyclerView.Adapter) liveZoneGridAdapter).notifyItemInserted(anyInt());
        liveZoneGridAdapter.addGridItemsToView(0, new Tile("test", 0, 0, "test"));
        Mockito.verify(liveZoneGridAdapter).notifyItemInserted(0);
    }

}

如果我像这样运行我的测试用例,它会在notifyItemInserted 上给出NullPointerException,这是RecyclerView.Adapter 类方法。 那么我该如何测试这个场景呢?

【问题讨论】:

  • 我没有检查项目点击。请阅读问题。

标签: android unit-testing junit mockito


【解决方案1】:

您收到该错误是因为 notifyItemInserted 是最终的。

Mockito 不能模拟/监视最终方法(尽管有一个孵化功能)。

所以,这条线行不通:

doNothing().when((RecyclerView.Adapter) liveZoneGridAdapter).notifyItemInserted(anyInt());

取而代之的是,它会调用真正的方法。 verify,也会调用真正的方法。

作为一种解决方法,您应该创建自己的非最终方法并让该方法调用真正的 notifyItemInserted。

在您的适配器类中:

public class LiveZoneGridAdapter extends RecyclerView.Adapter {
    ...

    public void addGridItemsToView(int position, Tile data) {
        tileList.add(position, data);
        internalNotifyItemInserted(position);
    }

    public void internalNotifyItemInserted(int position) {
        notifyItemInserted(position);
    }
}

然后在你的测试中:

import android.content.Context;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

public class AdapterTest {

    @Mock
    Context context;

    private LiveZoneGridAdapter liveZoneGridAdapter;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void addGridItemsToViewNotifiesParentAndAddsItemToTileList() {
        liveZoneGridAdapter = spy(new LiveZoneGridAdapter(context));

        doNothing().when(liveZoneGridAdapter).internalNotifyItemInserted(anyInt());

        liveZoneGridAdapter.addGridItemsToView(0, new Tile("test", 0, 0, "test"));
        verify(liveZoneGridAdapter).internalNotifyItemInserted(0);
    }

}

【讨论】:

猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2016-03-15
相关资源
最近更新 更多