为Android Instrumentation测试获取有效(非空)上下文

时间:2016-05-09 20:47:18

标签: java android junit mockito android-context

我查看过很多帖子并阅读有关Android Instrumentation测试的文档,但无法让我的代码正常工作。

我的情况是我无法使用模拟上下文对象,我需要一个有效的对象。

我尝试过使用:

@Before
public void setUp() throws Exception
{
    super.setUp();

    setActivityInitialTouchMode(true);
    // Injecting the Instrumentation instance is required
    // for your test to run with AndroidJUnitRunner.
    injectInstrumentation(InstrumentationRegistry.getInstrumentation());
    _context = getActivity();

    assertThat(_context, isA(Context.class));
}

但是我得到了

  

java.lang.RuntimeException:无法启动活动

我尝试让我的测试扩展InstrumentationTest并使用 getInstrumentation()。的getContext()

但那也是空的。

据我所知,仪器测试就是这样:当你需要利用应用程序时(即上下文)。

您知道如何使用junit4在Android Studio 2.0环境中访问有效的非null上下文对象吗?

这是我目前的最佳尝试:

@RunWith(AndroidJUnit4.class)
@SmallTest
public class StartWorkoutRadialProgressBarTest extends ActivityInstrumentationTestCase2
{
    Context _context;

    public StartWorkoutRadialProgressBarTest()
    {
        super(StartWorkoutRadialProgressBar.class);
    }

    @Before
    public void setUp() throws Exception
    {
        super.setUp();

        setActivityInitialTouchMode(true);
        // Injecting the Instrumentation instance is required
        // for your test to run with AndroidJUnitRunner.
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        _context = getActivity();

        assertThat(_context, isA(Context.class));
    }

    @Test
    public void initialization()
    {
        StartWorkoutRadialProgressBar bar = new StartWorkoutRadialProgressBar(100,100, _context);

        Assert.assertThat(4, is(4));
    }
}

注意:使用context = new MockContext()并不起作用,因为我收到错误,因此库会尝试调用资源。

1 个答案:

答案 0 :(得分:0)

我的构造函数是针对一个不是活动的类:

public StartWorkoutRadialProgressBarTest()
{
    super(StartWorkoutRadialProgressBarTest.class);
}

当我将其更改为我创建的通用活动类并调用A_Testing时,它可以工作:

public StartWorkoutRadialProgressBarTest()
{
    super(A_Testing.class);
}

事实证明,必须使用活动类初始化,因为ActivityInstrumentationTestCase2不会通过getActivity()调用提供有效的上下文对象。