如何使用ContentValues进行单元测试始终为null vs android.content.Intent中的方法getAction未进行模拟

时间:2017-09-23 18:47:29

标签: android unit-testing android-gradle android-sqlite junit4

最近我使用最新的android工作室进行了单元测试,这是3 beta 6,我发现即使我初始化ContentValues它也是空的。我需要它实际上是一个值/ init-ed ContentValues

我的gradle文件:

apply plugin: 'com.android.application'

android {

    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
        applicationId "com.cubedelement.soundplanner"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "org.mockito.testInstrumentationRunner"
        vectorDrawables.useSupportLibrary = true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }

    testOptions {
        unitTests.returnDefaultValues = true
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:palette-v7:26.1.0'
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.0', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    implementation 'com.google.dagger:dagger-android:2.11'
    implementation 'com.google.dagger:dagger-android-support:2.11' // if you use the support libraries
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.11'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.11'

    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test:rules:1.0.1'
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.google.code.gson:gson:2.8.0'
    testImplementation 'junit:junit:4.12'
    testImplementation 'org.powermock:powermock-api-mockito2:1.7.0'
    testImplementation 'org.powermock:powermock-module-junit4:1.6.5'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'org.mockito:mockito-core:2.8.47'
    androidTestImplementation 'org.mockito:mockito-core:2.8.47'
}

但等等,还有更多!

所以我还得到了一个简单的测试:

import android.content.ContentValues;

public class Test {
    @Test public void ContentValuesShouldNotBeNull(){
         ContentValues v = new ContentValues();
         assertEquals(v, null) // this is true, but I don't want it to be, help!
    }
}

这是android studio中的视图 android beta showing null for content values

所以我尝试了一个默认的gradle文件,发现contentvalues不是null。

这是文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.1'
    defaultConfig {
        applicationId "com.example.kelly_vernon.myapplication"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

老实说,在这一点上我并不理解gradle,但我知道我的配置,这是一堆支持匕首和其他价值观的想法并不是很好。

在尝试其他事情之后,我发现这是罪魁祸首:

testOptions {
    unitTests.returnDefaultValues = true
}

我弄明白我之所以有这个原因。我在另一个测试意图的区域进行测试,我需要默认值。

有没有办法将此限制为排除ContentValues,或者反之则不包括Intent

1 个答案:

答案 0 :(得分:0)

嗯,它已经解决了。在撰写本文时,您仍然无法针对像ContentValuesIntent这样的Android内容类进行单元测试。

因此,我已经介绍了Robolectric。这并不难,但这里有变化。

gradle文件:

testOptions {
    unitTests {
        returnDefaultValues = true
        includeAndroidResources = true // new line
    }
}

测试:

import android.content.ContentValues;

@RunWith(RobolectricTestRunner.class) //new line to start robolectric
public class Test {
    @Test public void ContentValuesShouldNotBeNull(){
         ContentValues v = new ContentValues();
         assertNotNull(v, null);
    }
}