gpt4 book ai didi

android - 访问 mObservables 时对 RecyclerView 适配器进行单元测试会引发 NullPointerException

转载 作者:行者123 更新时间:2023-12-04 11:13:21 25 4
gpt4 key购买 nike

我的 View 模型拥有一个非常简单的 recyclerview 适配器

当我尝试向它发送消息(进而调用 notifyDatasetChanged )时,它会抛出这样的异常

java.lang.NullPointerException
at androidx.recyclerview.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11996)
at

问题是 mObservers来自 AdapterDataObservable 的变量一片空白

问题是这扩展了 Observable<AdapterDataObserver>反过来定义 mObservers作为
protected final ArrayList<T> mObservers = new ArrayList<T>();

所以基本上在我的适配器被实例化的那一刻,它就会调用
private final AdapterDataObservable mObservable = new AdapterDataObservable();

(顺便说一下,mObservable不为null)

反过来应该调用 mObservers = new ArrayList<T>();
有人可以解释为什么这从未被调用吗?或者是否有办法解决这个问题?

作为旁注,适配器没有被模拟,它是一个实体对象。

编辑:

这是我正在使用的测试代码:
class LoginViewModelTest {

private lateinit var vm: LoginViewModel

@get:Rule
val rule = InstantTaskExecutorRule()

@Before
fun setUp() {

whenever(settings.hasShownWelcome).thenReturn(false)
whenever(settings.serverIp).thenReturn("http://127.0.0.1")

//this is where the crash happens
vm = LoginViewModel(settings, service, app, TestLog, TestDispatchers) { p -> permissionGranted }
}

以下是经过测试的代码:
class LoginViewModel(private val settings: ISettings, private val service: AppService, application: Application, l: ILog, dispatchers: IDispatchers, val permissionChecker: (String) -> Boolean) :  BaseViewModel(application, l, dispatchers)

val stepAdapter :StepAdapter

init {
val maxSteps = calculateSteps()
//after this assignment, during the normal run, the stepAdapter.mObservable.mObservers is an empty array
//during unit tests, after this assignment it is null
stepAdapter = StepAdapter(maxSteps)
}

最佳答案

我通过监视适配器和 stub 修复了我的 notifyDataSetChanged .

    val spyAdapter = spyk(adapter)
every { spyAdapter.notifyDataSetChanged() } returns Unit
spyAdapter.changeItems(items)
verify { spyAdapter.notifyDataSetChanged() }
请注意 changeItems来电 notifyDataSetChanged内部。

关于android - 访问 mObservables 时对 RecyclerView 适配器进行单元测试会引发 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181002/

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