我正在编写我的第一个Android数据库后端,我正在努力对我的数据库的创建进行单元测试.
目前我遇到的问题是获取一个有效的Context对象来传递给我的SQLiteOpenHelper实现.有没有办法在扩展TestCase的类中获取Context对象?我想到的解决方案是在我的TestCase的setup方法中实例化一个Activity,然后将该Activity的Context分配给我的测试方法可以访问的字段变量......但似乎应该有一个更简单的方法.
感谢您的输入!
梅西
我正在使用新的Android测试支持库(com.android.support.test:runner:0.2)来运行Instrumentation Tests(aka Device或Emulator Tests).
我用我的测试类注释@RunWith(AndroidJUnit4.class)并使用Android Studio来运行它们.
对于我的测试用例,我需要一个Context实例.我可以得到它,InstrumentationRegistry但它有两个上下文相关的方法,并不清楚有什么区别.
InstrumentationRegistry.getContext()vs 之间有什么区别InstrumentationRegistry.getTargetContext()?
我使用Android Studio 1.1.0的新单元测试支持功能运行了一些旧的测试.运行gradlew testDebug时,运行测试,但所有需要Context失败的测试都因为getContext(AndroidTestCase)/ getInstrumentation.getContext()(InstrumentationTestCase)都返回null.
我怎么解决这个问题?
这是我试过的两个变种:
import android.content.Context;
import android.test.InstrumentationTestCase;
public class TestTest extends InstrumentationTestCase {
    Context context;
    public void setUp() throws Exception {
        super.setUp();
        context = getInstrumentation().getContext();
        assertNotNull(context);
    }
    public void testSomething() {
        assertEquals(false, true);
    }  
}
和
import android.content.Context;
import android.test.AndroidTestCase;
public class TestTest extends AndroidTestCase {
    Context context;
    public void setUp() throws Exception {
        super.setUp();
        context = getContext();
        assertNotNull(context);
    }
    public void testSomething() {
        assertEquals(false, true);
    }
}
这是我的模块build.gradle:
apply plugin: …我正在尝试编写一个测试用例来验证写入共享首选项的类.我正在使用Android Studio v1.5.
在良好的旧日食中,使用时AndroidTestCase,第二个apk文件被部署到设备,并且可以使用检测上下文运行测试,因此您可以使用检测apk的共享首选项运行测试,而无需更改主apk的现有共享首选项文件.
我花了整个上午试图弄清楚如何在Android Studio测试中获得非空上下文.显然,为eclipse进行的单元测试与Android Studio测试框架不兼容,因为调用getContext()返回null.我以为我在这个问题中找到了答案:
 在Android junit测试用例中获取测试项目的上下文
随着旧版本的Android Studio没有完整的测试支持,事情已经发生了变化.所以很多答案都只是黑客攻击.显然现在不是扩展InstrumentationTestCase,AndroidTestCase你应该像这样编写测试:
@RunWith(AndroidJUnit4.class)
public class MyTest {
    @Test
    public void testFoo(){
        Context instrumentationContext = InstrumentationRegistry.getContext();
        Context mainProjectContext = InstrumentationRegistry.getTargetContext();            
    }   
}
所以我现在有一个非null的检测上下文,并且该getSharedPreferences方法返回一个似乎有效的实例,但实际上没有写入首选项文件.
如果我做:
context = InstrumentationRegistry.getContext();      
然后,SharedPreferences编辑器正确写入和提交,不会抛出任何异常.仔细观察后,我可以看到编辑器正在尝试写入此文件:
data/data/<package>.test/shared_prefs/PREFS_FILE_NAME.xml
但是文件永远不会被创建或写入.
但是使用这个:
context = InstrumentationRegistry.getTargetContext(); 
编辑器正常工作,并将首选项写入此文件:
/data/data/<package>/shared_prefs/PREFS_FILE_NAME.xml
首选项以私有模式实例化:
SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
据我所知,运行测试后没有测试apk上传到设备.这可能解释了为什么文件不是使用检测上下文编写的.这个上下文是否可能是一个无声地失败的虚假上下文?
如果是这种情况,我怎样才能获得真实的仪器上下文,以便我可以在不改变主项目偏好的情况下编写首选项?
instrumentation android unit-testing android-context android-studio
我需要访问JUnit Test的Android上下文.
我尝试过使用MockContext并扩展AndroidTestCase,但每次我收到错误说(存根!)
导入库,比如androidx.test:core:1.2.0,androidx.test.ext:truth:1.2.0,com.google.truth:truth:0.44,等进入当地的JUnit命名测试类ExampleUnitTest.kt。
未解决的参考:测试
示例UnitTest.kt
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import com.google.common.truth.Truth.assertThat