Модульное тестирование адаптера RecyclerView вызывает исключение NullPointerException при доступе к mObservables - PullRequest
1 голос
/ 01 октября 2019

Модель моего представления содержит очень простой адаптер повторного просмотра

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