Articles of robolectric

如何在测试执行期间从assets文件夹访问文件?

如何在unit testing执行期间从assets文件夹访问文件? 我的项目是使用Gradle构建的,我使用Robolectric来运行测试。 似乎gradle正在认识assets : 这就是我在努力阅读文件的方式: public String readFileFromAssets(String fileName) throws IOException { InputStream stream = getClass().getClassLoader().getResourceAsStream(“assets/” + fileName); Preconditions.checkNotNull(stream, “Stream is null”); BufferedReader reader = new BufferedReader(new InputStreamReader(stream, “UTF-8”)); return IOUtils.toString(reader); } 但是stream始终为null 。 我尝试了很多不同的方法,即使用不同的方法定义文件的路径。 非常感谢你提前。

Robolectric.setupActivity()和Robolectric.buildActivity()有什么区别?

我是Robolectric的新手,请帮助我理解,这些之间有什么区别 loginActivity = new LoginActivity(); loginActivity = Robolectric.setupActivity(LoginActivity.class); loginActivity = Robolectric.buildActivity(LoginActivity.class).create()。start()。resume()。get();

使用带有Gradle的Robolectric时的资源$ NotFoundException

我一直在关注设置Robolectric来测试我的Android Gradle项目。 我一直在遇到这个错误: android.content.res.Resources$NotFoundException: no such label com.mypackage.dev:string/app_name 通过从教程中下载示例项目,我已经确定问题是我的productFlavors (dev,staging,production)。 向工作示例项目添加flavor会导致同样的问题。 您可以在此答案中看到我的build.gradle的大纲。 我已经看到了各种答案(例如这里 ),这表明我需要为每种风格指定sourceSets 。 我已经尝试了很多组合,但不能完全正确。 有人可以帮忙吗? 令我困惑的另一件事是我见过的所有Robolectric样本似乎都在为“instrumentTest”指定sourceSets和依赖项,即使Robolectric测试总是只在“test”文件夹中。 在我的情况下,我已经在instrumentTest文件夹中进行了Robotium测试,我不明白为什么我需要为Robotium代码添加Robolectric依赖项。

Robolectric找不到资源和AndroidManifest.xml

我已经创建了新的TestProject并在我的testMethod中添加了以下行: Robolectric.getShadowApplication().getString(R.string.mystring); 我的测试失败了 android.content.res.Resources$NotFoundException: unknown resource 2131558482 控制台显示警告: WARNING: No manifest file found at .\..\..\MyProject\AndroidManifest.xml.Falling back to the Android OS resources only. To remove this warning, annotate your test class with @Config(manifest=Config.NONE). WARNING: no system properties value for ro.build.date.utc AndroidManifest.xml是否需要获取字符串资源? 我试图通过org.robolectric.Config.properties和@Config添加Manifest,但警告仍然发生,我无法获得字符串资源。 我确保清单的相对路径是正确的。 此外,我正在改变JUnit运行配置,但这没有帮助。

让Robolectric与Volley合作

我想让Volley和Robolectric一起工作。 我可以看到我的HTTP请求被调用,并且调用了parseNetworkResponse(我正在发送一个JsonRequest的自定义子类),但我的监听器没有被调用。 任何建议? 这是一个代码示例: @Test public void testTypeAheadClient() throws Exception { Robolectric.getFakeHttpLayer().interceptHttpRequests(false); //mRemoteRequestQueue and mCustomRequest are set up previously mRemoteRequestQueue.add(mCustomRequest); } private static class CustomRequest extends JsonRequest { public CustomRequest(String url, Response.Listener listener, Response.ErrorListener errorListener) { super(Request.Method.GET, url, null, listener, errorListener); } @Override protected Response parseNetworkResponse(NetworkResponse response) { System.out.println(“in parseNetworkResponse”); try { MyObject myObject = […]

使用PowerMock和Robolectric – IncompatibleClassChangeError

我正在尝试使用PowerMockito来模拟Android Robolectric测试中的一些静态方法。 我按照这里的指示使用JUnit 4.8.2,Robolectric 2.2,Mockito 1.9.5和PowerMock 1.9.5。 因为我必须使用RoboElectricTestRunner ,所以我试图使用PowerMockRule来引导PowerMock。 但是,当运行PowerMock的测试时,我得到了一个不幸的java.lang.IncompatibleClassChangeError 。 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597) at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:348) 引起:java.lang.IncompatibleClassChangeError:在java.lang.ClassLoader.defineClass1上实现类(本机方法) 在java.security.ClassLoader.defineClass(ClassLoader.java:621)的java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 如果我在org.powermock库之后放了org.powermock我得到: java.lang.IncompatibleClassChangeError:class org.objectweb.asm.tree.ClassNode在java.lang.ClassLoader.defineClassCond(ClassLoader)的java.lang.ClassLoader.defineClass1(Native Method)中将接口org.objectweb.asm.ClassVisitor作为超类。 .java:637)java.lang.ClassLoader.defineClass(ClassLoader.java:621)java.security.ClassLoader.defineClass(SecureClassLoader.java:141)java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access $ 000(URLClassLoader.java:58)at java.net.URLClassLoader $ 1.run(URLClassLoader.java:197)at java.security.AccessController.doPrivileged(Native Method) 在每个unit testing。 根据Maven依赖性:树Robolectric和PowerMock不共享任何依赖关系。 但显然org.powermock:powermock-module-javaagent打包了一些org / objectweb / asm类,而Robolectric依赖于org.ow2.asm:asm:jar:4.1导致冲突。 @RunWith(RobolectricTestRunner.class) @PrepareForTest(Helper.class) @PowerMockIgnore({“com.sun.jmx.*”, “javax.management.*”}) public class HelpFragTest { @Rule public […]

Androidunit testing中的Mock Retrofit Observable 响应

我有一个API接口,我正在测试涉及网络调用的View 。 @Config(emulateSdk = 18) public class SampleViewTest extends RobolectricTestBase { ServiceApi apiMock; @Inject SampleView fixture; @Override public void setUp() { super.setUp(); //injection is performed in super apiMock = mock(ServiceApi.class); fixture = new SampleView(activity); fixture.setApi(apiMock); } @Test public void testSampleViewCallback() { when(apiMock.requestA()).thenReturn(Observable.from(new ResponseA()); when(apiMock.requestB()).thenReturn(Observable.from(new ResponseB()); AtomicReference testResult = new AtomicReference(); fixture.updateView(new Callback() { @Override public […]

JaCoCo不适用于Robolectric测试

我想在我的android项目中生成我的JUnit测试的代码覆盖率报告,所以我添加了JaCoCo gradle插件。 这是我的项目级build.gradle文件: apply plugin: ‘jacoco’ buildscript { repositories { jcenter() } dependencies { classpath ‘com.android.tools.build:gradle:2.0.0-beta6’ classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ } } allprojects { repositories { jcenter() maven { url “https://oss.sonatype.org/content/repositories/snapshots” } } } task clean(type: Delete) { delete rootProject.buildDir } subprojects { prj -> apply plugin: ‘jacoco’ jacoco { toolVersion ‘0.7.6.201602180812’ } task jacocoReport(type: JacocoReport, dependsOn: […]

如何在Android Robolectric测试中强制配置更改?

我正在使用robolectric使我的androidunit testing足够快有用。 我想测试我编写的代码,同时屏幕方向正在改变,以模拟一个常见的真实世界用例。 具体来说,我正在测试的是对服务器的异步http调用,在获取结果后解析了一些xml。 我对所有工作得很好的unit testing,但无法弄清楚如何模拟屏幕旋转。 任何导致活动重新创建的状态更改都很好,它不一定是屏幕旋转。 使用模拟器的解决方案不是一个选项,因为我每分钟运行几次测试,它们必须在2秒内运行。 如果可能的话,我也希望这能与roboguice合作。 谢谢。

使用JUnit +的unit testing用例(Android中的Robolectric或Mockito或两者)

这是我第一次在Android中编写unit testing用例。 所以我搜索了很多东西。 Robolectric framewordk – 在JVM上运行 Mockito Framwork – 模拟物体 所以我对Robolectric和Mokito有些怀疑。 我是否必须在Android应用中仅使用Robolectric和JUnit? 我应该只在Android应用中使用Mockito吗? 我应该同时使用这两个框架吗? Mockito和Robolectric有什么区别? 我在寻找Mokito和Robolectric之间的区别,但没有得到任何正确的答案。 请建议。