gpt4 book ai didi

android - 使用 Mockito 对 RecyclerView 适配器进行单元测试

转载 作者:行者123 更新时间:2023-12-04 23:50:12 26 4
gpt4 key购买 nike

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

}

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

最佳答案

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

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

所以,这条线不起作用:

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

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

作为一种解决方法,您应该创建自己的非 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);
}

}

关于android - 使用 Mockito 对 RecyclerView 适配器进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com