Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MutableLiveData is null in JUnitTest

Tags:

I want to write a unit test. Therefore I need MutableLiveData. I started with a very basic test for setup but I cannot instantiate a MutableLiveData object. I is always null when I run the test. Do I have to mock anything? Any suggestions?

@RunWith(MockitoJUnitRunner.class) public class DefaultLiveDataTest {      private static final int EXPECTED = 5;      private final MutableLiveData<Integer> underTest = new MutableLiveData<>();       @Test     public void exampleTest() {      underTest.setValue(EXPECTED); //underTest is Null     assertEquals(underTest.getValue().intValue(), EXPECTED);      } }  java.lang.NullPointerException at android.arch.core.executor.DefaultTaskExecutor.isMainThread(DefaultTaskExecutor.java:58) at android.arch.core.executor.ArchTaskExecutor.isMainThread(ArchTaskExecutor.java:116) at android.arch.lifecycle.LiveData.assertMainThread(LiveData.java:434) at android.arch.lifecycle.LiveData.setValue(LiveData.java:279) at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33) at com.mypackage.DefaultLiveDataTest.test_that_live_data_has_default_value(DefaultLiveDataTest.java:22) 

build.gradle

apply plugin: 'com.android.application'  android { compileSdkVersion 27 defaultConfig {     applicationId 'com.mypackage.title'     minSdkVersion 16     targetSdkVersion 27     versionCode 1     versionName '1.0'     testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' }  testOptions {     unitTests.returnDefaultValues = true }  dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:support-vector-drawable:27.1.1' implementation 'android.arch.lifecycle:extensions:1.1.1' implementation 'android.arch.lifecycle:viewmodel:1.1.1' implementation 'android.arch.lifecycle:livedata:1.1.1'  annotationProcessor 'android.arch.lifecycle:compiler:1.1.1' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:1.10.19' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' annotationProcessor 'org.androidannotations:androidannotations:4.4.0' implementation 'org.androidannotations:androidannotations-api:4.4.0' compileOnly 'org.projectlombok:lombok:1.16.20' annotationProcessor 'org.projectlombok:lombok:1.16.20' } 
like image 963
Kewitschka Avatar asked Apr 15 '18 09:04

Kewitschka


2 Answers

Looks like you are missing the android.arch.core:core-testing dependency.

testImplementation "android.arch.core:core-testing:1.1.1" 

This allows you to use the InstantTaskExecutorRule in your test, which will get rid of the isMainThread call.

https://developer.android.com/reference/android/arch/core/executor/testing/InstantTaskExecutorRule.html

@Rule public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule(); 
like image 171
Chris Avatar answered Oct 21 '22 08:10

Chris


Add an executor InstantTaskExecutorRule() as a member of the Test class

A JUnit Test Rule that swaps the background executor used by the Architecture Components with a different one which executes each task synchronously. You can use this rule for your host side tests that use Architecture Components.

//@RunWith(JUnit4::class)   // For JUnit4 @ExtendWith(InstantExecutorExtension::class)   // For JUnit5 class FilterViewModelTest {      @Rule @JvmField     val instantTaskExecutorRule = InstantTaskExecutorRule()      @Test     fun test() {         //Here you don't ask if isMainThread     } } 

build.gradle(:mobile)

android {     //...     dependencies {         //...         testImplementation 'androidx.arch.core:core-testing:2.1.0'         androidTestImplementation 'androidx.arch.core:core-testing:2.1.0'     } } 

GL

InstantTaskExecutorRule

like image 21
Braian Coronel Avatar answered Oct 21 '22 08:10

Braian Coronel