Articles of robolectric

测试中的Robolectric和Google Analytics错误

我一直在用Robolectric进行测试,这一切都很棒。 然后我将Google Analytics实施到我的应用程序类,测试开始失败。 当我在测试期间膨胀视图时,似乎发生了失败。 这是堆栈跟踪: java.lang.NullPointerException: null at com.google.analytics.tracking.android.AnalyticsGmsCoreClient$AnalyticsServiceConnection.onServiceConnected(AnalyticsGmsCoreClient.java:176) at org.robolectric.shadows.ShadowApplication$2.run(ShadowApplication.java:209) at org.robolectric.util.Scheduler$PostedRunnable.run(Scheduler.java:162) at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:107) at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:92) at org.robolectric.util.Scheduler.advanceToLastPostedRunnable(Scheduler.java:68) at org.robolectric.util.Scheduler.unPause(Scheduler.java:25) at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:219) at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:258) at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:32) at android.view.ViewGroup.addView(ViewGroup.java) at android.view.ViewGroup.addView(ViewGroup.java:3225) at android.view.LayoutInflater.rInflate(LayoutInflater.java:750) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at android.view.LayoutInflater.inflate(LayoutInflater.java:352) at org.robolectric.shadows.ShadowView.inflate(ShadowView.java:82) at android.view.View.inflate(View.java) 这是我的BaseActivity的Robolectric代码: @RunWith(RobolectricTestRunner.class) public class BaseActivityTest { ActivityController activityController; TestActivity activity; @Before public […]

我怎么知道我的应用程序是否与Robolectric一起运行?

我有一个使用ORMLite / SQLite的Android应用程序,我将Robolectric与JUnit 4结合使用,允许我在Android Studio和Jenkins构建服务器上运行unit testing。 通常我会在我的测试中,在设置中设置测试数据,然后针对它运行我的测试场景但是当我尝试这样做时,我开始遇到问题和exception,这似乎与被锁定的文件有关,而且似乎是是别人有过的问题…所以我到目前为止所做的是使用我的数据库助手中的create database方法创建一些测试期望存在的虚拟数据。 问题是我的应用程序现在需要插入一个真正的数据库,我不能让它在运行时设置虚拟数据。 如果在我的数据库帮助程序类中有一种方法可以检测代码是在设备上还是在Robolectric中执行?

与Mockito间谍的Robolectric buildActivity()?

在我看来,使用Robolectric的生命周期实用程序构建一个Activityunit testing(从Robolectric.buildActivity() )并使用Robolectric.buildActivity()间谍监视相同的Activity是相互排斥的。 因为buildActivity()控制Activity对象的构造,所以在调用buildActivity()之后,为Activity添加间谍的唯一地方。 但是,在事后添加间谍时,间谍无法正常运作。 在监视ActivityController生命周期方法(如create() , start()和resume()副作用时尤其如此。 我假设这是因为ActivityController持有对“真正的”Activity对象的引用,而不是后来添加的间谍。 那么有没有办法窥探一个使用Robolectric进行unit testing的Activity,这样当通过Robolectric的ActivityController调用生命周期方法时,间谍是否正常工作?

使用Robolectric测试DialogFragments

我有几个关于使用Robolectric测试DialogFragment类的问题,因为我在Internet上遇到了关于这个主题的完全缺乏的信息。 传递给onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)的正确参数是什么? 我无法将parameter passing给DialogFragment ,我使用以下方法: activity = new Activity(); dialog = new DialogFragment(); Bundle bundle = new Bundle(); dialog.setArguments(bundle); FragmentManager fm = activity.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(dialog, “fragment”); ft.commit(); 每当代码尝试访问参数时,它都会以NullPointerException崩溃。 将高度赞赏有关这些主题的任何想法。

Robolectric 3.0无法测试启动HandlerThread的函数

我有一个简单的类Job ,它扩展了HandlerThread : public class Job extends HandlerThread{ public Job(String name) { super(name); } … } 然后,我有一个JobUtils类,它具有获取Job & start() : public JobUtils { public JobUtils() { } // I unit test this function in my test class below public Job getAndStartJob(String name) { Job job = new Job(name); job.start(); } } 我在unit testing中使用Robolectric 3.0,我测试了JobUtils类的’ getAndStartJob(String […]

如何在测试执行期间从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 = […]