最近我使用最新的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!
}
}
所以我尝试了一个默认的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
?
答案 0 :(得分:0)
嗯,它已经解决了。在撰写本文时,您仍然无法针对像ContentValues
和Intent
这样的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);
}
}