Articles of unit testing

与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崩溃。 将高度赞赏有关这些主题的任何想法。

Android Studio:无法在检测测试中写入共享首选项

我正在尝试编写一个测试用例来validation写入共享首选项的类。 我正在使用Android Studio v1.5。 在良好的旧日食中,当使用AndroidTestCase ,第二个apk文件被部署到设备,并且可以使用检测上下文运行测试,因此您可以使用检测apk的共享首选项运行测试,而无需更改主apk的现有共享首选项文件。 我花了一整个上午试图弄清楚如何在Android Studio测试中获得非空上下文。 显然,为eclipse进行的unit testing与Android Studio测试框架不兼容,因为调用getContext()返回null。 我以为我在这个问题中find了答案: 在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编辑器正确写入和提交,不会抛出任何exception。 仔细观察后,我可以看到编辑器正在尝试写入此文件: data/data/.test/shared_prefs/PREFS_FILE_NAME.xml 但是文件永远不会被创建或写入。 但是使用这个: context = InstrumentationRegistry.getTargetContext(); 编辑器正常工作,并将首选项写入此文件: /data/data//shared_prefs/PREFS_FILE_NAME.xml 首选项以私有模式实例化: SharedPreferences […]

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 […]

在androidTest文件夹中创建DummyActivity以进行测试

我在androidTest文件夹中创建了一个虚拟活动,并在androidTest文件夹中的AndroidManifest文件中声明了该活动。 我的基本目的是通过使用framelayout容器将其放入虚拟活动来测试可重用片段。 AndroidManife文件夹里面有AndroidManifest.xml 我的测试类TestWidgets.java public class TestWidgets extends ActivityInstrumentationTestCase2 { private AppCompatActivity mActivity; public TestWidgets() { super(DummyActivityForTest.class); } @Override public void setUp() throws Exception { super.setUp(); mActivity = getActivity(); } @Test public void testAddSpecializationClick() { onView(withId(R.id.widgets_rv)).perform( RecyclerViewActions.actionOnItemAtPosition(4, click())); Assert.fail(“Not Implemented”); } 当我运行我的测试类时,它抛出exception, java.lang.RuntimeException: Could not launch activity at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:373) at android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:119) at android.test.InstrumentationTestCase.launchActivity(InstrumentationTestCase.java:97) at android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:104) […]

测试一个名为setResult的活动

我正在为一个活动编写测试(我的测试类扩展了ActivityInstrumentationTestCase2),我已经编写了一些基本的测试并且工作正常。 但是我的活动完成时会通过setResult(结果代码,Intent i)将额外数据返回给调用活动。我想用仪器做什么让我的活动完成,然后检查它在setResult调用中传递的内容。 是否有一些框架提供了这样做的方式? 我还没有find任何东西,一种方法是子类化活动类并覆盖setResult,让它记住并公开传递给setResult的内容(原来setResult是final,所以你也不能这样做) ,似乎应该有更好的方法。

Android @NonNull的用处

经过几次阅读和这样的问题后,我想知道是否有一点使用@NonNull Android支持注释。 如果我尝试使用注释为@NonNull的null参数调用方法,我可以看到来自Android Studio的非常小的警告。 只是一个警告? unit testing怎么样? 我应该用空参数测试方法吗? 如果我这样做…我将得到一个NullPointerException ,我的测试将失败 。 假设我们是两位开发人员。 一个在API上工作,另一个在各种方式下测试API。 作为第二个开发人员,我有责任测试所有内容,以便API具有防弹function。 这是unit testing的重点,对吗? 那么……第一个使用@NonNull的开发人员有什么意义呢? 如果其他人将此API与null参数一起使用……那么API将抛出NPE 。 然后他会想:“Urg,那个API糟透了…… NPE!” 他会是对的。 那个淘气的开发人员没有检查他发送的参数是否为null应该面临IllegalArgumentException,因为这是他的错误而不是API的错误! 我错了吗 ? 我认为这些注释会强制编译器显示错误,例如attempting to call methodName(@NonNull Object object) with null parameter 。 更新1 好的,谢谢大家的意见。 如果可能的话,我想总结一下我在这里遇到的“问题”。 以抽象的方式。 我编写了一些代码(API,一个库,一个类,无论如何),私有内部代码由提供function的公共方法包装。 假设这些公共方法将被其他任何人(包括我)使用。 他们中的一些人接受的参数必须永远不会为空 ,否则一切都会破裂。 阅读您的评论,我面临以下选择: 继续使用Java Documentation支持的契约/注释( @NonNull ),规定parameter must not be null 。 不要检查空参数(否则IDE会警告我),不知何故,祈祷我永远不会收到空参数; 与上面相同,但强制执行空检查(即使IDE会警告condition […]

使用JUnit进行unit testingSparseArray(使用JVM)

我有一个实现,它使用Integer作为HashMap中的键。 它已经使用JUnit进行了unit testing。 但我想将其更改为SparseArray,这是Android的更优化版本。 我不确定如何使用JUnit进行unit testing。 有没有人有更好的方法来做到这一点?

android数据绑定unit testing错误无法解析数据绑定编译器选项。 PARAMS:

当我尝试为我的kotlin android项目设置unit testing时,我遇到了以下错误。 以前有人遇到过这种问题吗? 这已被标记为官方错误跟踪器上的错误 FAILURE:构建因exception而失败。 *出了什么问题:任务执行失败’:app:compileDebugUnitTestJavaWithJavac’。 > java.lang.RuntimeException:无法解析数据绑定编译器选项。 参数:kapt.annotations:/Users/trevor/Dev/Android/workspace/gitlab-example/app/build/tmp/kapt/debugUnitTest/wrappers/annotations.debugUnitTest.txt kapt.kotlin.generated:/ Users / trevor / Dev / Android / workspace / gitlab-example / app / build / tmp / kapt / debugUnitTest / kotlinGenerated *尝试:使用–info或–debug选项运行以获得更多日志输出。 *exception是:org.gradle.api.tasks.TaskExecutionException:任务执行失败’:app:compileDebugUnitTestJavaWithJavac’。 在org.gradle上的org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:84)org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)位于org.gradle.api.internal的org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)上的.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)位于org.gradle.api.internal.tasks.execution的org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46).tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88) .skipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTas 位于org.gradle.exe。执行(CatchExceptionTaskExecuter.java:34)的orE.gradle.execution.taskgraph.DefaultTaskGraphExecuter $ EventFiringTaskWorker $ 1.execute(DefaultTaskGraphExecuter)中的kExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) .java:236)在org.gradle上的org.gradle.execution.taskgraph.DefaultTaskGraphExecuter $ EventFiringTaskWorker $ 1.execute(DefaultTaskGraphExecuter.java:228)org.gradle.internal.Transformers $ 4.transform(Transformers.java:169)。 org.gradle.internal.progress.DefaultOperationExecutor.run(DefaultBuildOperationExecutor.java:61)中的internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)org.gradle.execution.taskgraph.DefaultTaskGraphExecuter $ EventFiringTaskWorker.execute(DefaultTaskGraphExecuter。 java:228)org.gradle.execution.taskgraph.DefaultTaskGraphExecuter […]

无法解决以下活动:意图

我在运行Androidunit testing时遇到问题。 当我尝试运行一个简单的测试时,我收到了这个错误。 这是日志: Blockquote java.lang.RuntimeException:无法解析以下活动:android.app.Instrumentation.startActivitySync(Instrumentation.java)中的Intent {act = android.intent.action.MAIN flg = 0x10000000 cmp = com.wsandroid.Activities / .SplashActivity} :371)在android.test.InstrumentationTestCase.launchActivity(InstrumentationTestCase.java:98)的android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:120)上的android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:87) Android下的android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)上的android.testandA.AndroidTestRunner.runTest(AndroidTestRunner.java:169)上的.wsandroid.test.activity.TestEULA.setUp(TestEULA.java:15)。 test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)在android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1447) Android小于2.2时会出现此错误。 它适用于Android 2.2模拟器。 然而,Android 2.2模拟器有两次发送密钥的错误,即使我们只按了一次。 要测试的应用程序在Android 2.2平台上运行。 感谢您是否有人可以帮助我。 Dzung。