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

标签 android unit-testing android-recyclerview

我的 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/

相关文章:

android - 是否有可能在 Firebase 中控制洪水

android - BroadcastReceiver 向 IntentService 发送 Intent 时单元测试失败

.net - 我可以在单元测试中使用.net线程振动器吗?

c++ - cppUnit 在启动每个单元测试时是否使用 fork()?

android - 在哪里使用 onSaveInstanceState 和 onRestoreInstanceState 方法?

android - 是否存在监听 RecyclerView 项目更改的现有方法?

java - SetOnKeyListener 不适用于 gridview

android - 布局太高的地方未显示 ListView

Android 动画 - 放大和淡入淡出以及背景过渡

android - Libgdx 模板和形状渲染器