Модель моего представления содержит очень простой адаптер повторного просмотра
Когда я пытаюсь отправить ему сообщения (которые, в свою очередь, вызывают 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 не является нулевым)
, который, в свою очередь, должен вызывать 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)
}