如何在Robolectric中访问应用程序的上下文?

133

实际上,我需要获取 API 调用的响应,为此我需要 Context

14个回答

2
这对我来说在Robolectric 3.5.1版本下有效:ShadowApplication.getInstance().applicationContext

请注意,看起来4.0版本将删除此方法;如果您的应用程序正常工作,请最好坚持使用RuntimeEnvironment.applicationRuntimeEnvironment.application.getApplicationContext() - qix

1

使用Robolectric.getShadowApplication()比直接使用Robolectric.application更安全。


但是如果我需要访问自定义应用程序的一些自定义属性呢?似乎我无法从影子应用程序中获取真实对象。 - Denys Kniazhev-Support Ukraine
@DenisKniazhev 抱歉,我无法为您回答。在我们开始使用Robolectric后不久,我们开始使用Travis作为CI,但它们并不兼容。我的猜测是你可以将其转换为你的应用程序,或者你可能需要创建一个自定义运行器以此方式访问它。祝你好运! - Cassie
谢谢,目前我只是坚持使用 Robolectric.application - Denys Kniazhev-Support Ukraine
8
"Robolectric.getShadowApplication()" 不可用。 - IgorGanapolsky

1
在你的情况下,我认为你应该注意到你实际上正在测试什么。有时候遇到不可测试的代码或看似不可测试的代码问题,这可能是你的代码需要重构的信号。
对于API调用响应,您可能不想测试API调用本身。测试任意Web服务发送/接收信息是否可行可能并不必要,而是要测试您的代码如何处理和处理响应。
在这种情况下,最好重构您要测试的代码。将响应解析/处理拆分到另一个类中,该类接受一个简单的字符串,并通过注入样本字符串响应来进行测试。
这更多或多少地遵循SOLID(单一职责原则和依赖反转原则中的S和D)的思想。

0

好的,我知道很多人在我之前已经回答过这个问题,可能已经过时了。

    when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
    when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());

    sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
    sut = new BundleManagerImpl(mockApplication,
            processHtmlBundle, resultListener, sharedPref);

我得到了null,因为when()部分在sut初始化之后。这可能会帮助你们中的一些人。

另外我有

@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)

在课程开始时
另外
 when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接