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