Android 使用Mockito的单元测试RecyclerView适配器
在Recycler视图适配器中,我有以下方法:Android 使用Mockito的单元测试RecyclerView适配器,android,unit-testing,junit,mockito,Android,Unit Testing,Junit,Mockito,在Recycler视图适配器中,我有以下方法: public void addGridItemsToView(int position, Tile data) { tileList.add(position, data); notifyItemInserted(position); } 我想对这个方法进行单元测试,并检查是否调用了notifyitemserted(position) 这是我的测试课: public class AdapterTest { @Mock
public void addGridItemsToView(int position, Tile data) {
tileList.add(position, data);
notifyItemInserted(position);
}
我想对这个方法进行单元测试,并检查是否调用了notifyitemserted(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
类方法。
那么我该如何测试这个场景呢?您会得到这个错误,因为
notifyItemInserted
是最终的
Mockito无法模拟/监视最终方法(尽管存在孵化特性)
所以,这一行行不通:
doNothing().when((RecyclerView.Adapter) liveZoneGridAdapter).notifyItemInserted(anyInt());
相反,它将调用real方法<代码>验证,也将调用real方法
作为一种变通方法,您应该创建自己的非final方法,并让该方法调用实际的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);
}
}
我没有检查项目点击。请阅读问题。您也可以尝试孵化Mockito功能来测试最终方法: