Как использовать «объект приложения» в случаях AndroidTest?- Android - PullRequest
0 голосов
/ 14 мая 2019

Я пишу тестовые случаи в androidTest , и мой код имеет Pattern.EMAIL_ADDRESS, так как в модульных тестах у меня нет доступа к классам фреймворка Android, а также я не использую Roboelectric для модульного тестирования.

Я получаю NullPointerException для объекта приложения, как в моем ResetPasswordViewModel Я использую этот application объект, чтобы получить строковое значение формы string.xml. Даже я издевался @Mock Application application, но все равно он возвращает ноль. Я пытался использовать InstrumentationRegistry.getTargetContext(), но все равно ничего не получается.

Я что-то упустил? В чем может быть проблема?

Как использовать application объект в androidTest случаях? Пожалуйста, обратитесь ниже код:

@RunWith(AndroidJUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ResetPasswordUnitTestsInt {

ResetPasswordViewModel resetPasswordViewModel;
@Rule
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
@Mock
Application application;
@Mock
Patterns patterns;

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
    resetPasswordViewModel = new ResetPasswordViewModel(application);
}

@Test
public void a_testEmailIdFieldNegativeCase() {
    resetPasswordViewModel.userName.setValue("");
    resetPasswordViewModel.setErrorVisibilityIfBlankField();
    Assert.assertEquals(true, resetPasswordViewModel.userNameErrorVisibility.getValue());
}
}

NulllPointerError

Gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.test.newtest"
    minSdkVersion 19
    targetSdkVersion 28
    versionCode 2
    versionName "1.1"
    multiDexEnabled true
    testInstrumentationRunner 
 "android.support.test.runner.AndroidJUnitRunner"
}

dataBinding {
    enabled = true
}

testOptions {
    unitTests.returnDefaultValues = true
}

testOptions {
    unitTests {
        includeAndroidResources = true
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android- 
optimize.txt'), 'proguard-rules.pro'
    }
}

}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
def design = "28.0.0"
implementation "com.android.support:appcompat-v7:$design"
implementation "com.android.support:design:$design"
implementation "com.android.support:recyclerview-v7:$design"

implementation 'com.android.support.constraint:constraint- 
layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso- 
core:3.0.2'

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


// reactive
implementation 'io.reactivex.rxjava2:rxjava:2.1.9'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'com.squareup.retrofit2:retrofit-mock:2.0.0'
implementation 'com.squareup.okhttp3:mockwebserver:3.8.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-intents:3.0.2'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

def daggerVer = 2.16
implementation "com.google.dagger:dagger:$daggerVer"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVer"
compileOnly 'javax.annotation:jsr250-api:1.0'
implementation 'javax.inject:javax.inject:1'

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

//implementation 'com.google.android.material:material:1.0.0'

def lifeCycle = "1.1.1"
implementation "android.arch.lifecycle:extensions:$lifeCycle"
/*implementation "android.arch.lifecycle:runtime:$lifeCycle"
annotationProcessor "android.arch.lifecycle:compiler:$lifeCycle"*/
implementation "android.arch.persistence.room:runtime:$lifeCycle"
implementation 'com.mikhaellopez:circularimageview:3.2.0'
annotationProcessor 
"android.arch.persistence.room:compiler:$lifeCycle"

implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.android.support:multidex:1.0.3'

implementation 'commons-beanutils:commons-beanutils:1.9.3'
implementation 'org.mockito:mockito-core:2.23.4'
androidTestImplementation 'org.mockito:mockito-android:2.18.3'
}

1 Ответ

1 голос
/ 14 мая 2019

Похоже, вы что-то упустили в конфигурации AndroidTest (может быть, где-то в Gradle).Вы пытались использовать методы модульного тестирования вместо автоматических тестов.В любом случае, вот пример фиктивной конфигурации, основанной на вашей ошибке:

    Mockito.when(applicaiton.getResources().getString(org.mockito.ArgumentMatchers.anyInt())).thenReturn("your mocked value")

Конечно, в будущем вы столкнетесь с другими ошибками.Просто продолжайте настраивать любой макет вручную, это трудный путь для настоящего JEDI

...