配置Robolectric,Android Studio和Gradle以获取测试应用程序

前端之家收集整理的这篇文章主要介绍了配置Robolectric,Android Studio和Gradle以获取测试应用程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试使用gradle的Android Studio 0.5.8.

我当前的根构建文件

  1. buildscript {
  2. repositories {
  3. mavenCentral()
  4. maven {
  5. url 'https://oss.sonatype.org/content/repositories/snapshots'
  6. }
  7. }
  8. dependencies {
  9. classpath 'com.android.tools.build:gradle:0.9.+'
  10. classpath 'com.novoda.gradle:robolectric-plugin:0.0.1-SNAPSHOT'
  11. }
  12. }
  13. allprojects {
  14. repositories {
  15. mavenCentral()
  16. maven {
  17. url 'https://oss.sonatype.org/content/repositories/snapshots'
  18. }
  19. }
  20. }

我的app build.gradle:

  1. apply plugin: 'android'
  2. apply plugin: 'robolectric'
  3. android {
  4. compileSdkVersion 19
  5. buildToolsVersion "19.0.3"
  6. dependencies {
  7. androidTestCompile 'org.robolectric:robolectric:2.3-SNAPSHOT'
  8. androidTestCompile 'org.mockito:mockito-all:1.9.5'
  9. androidTestCompile 'junit:junit:4.+'
  10. }
  11. defaultConfig {
  12. minSdkVersion 9
  13. targetSdkVersion 19
  14. versionCode 1
  15. versionName "1.0"
  16. }
  17. buildTypes {
  18. release {
  19. runProguard false
  20. proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.txt'
  21. }
  22. }
  23. }
  24. dependencies {
  25. compile fileTree(dir: 'libs',include: ['*.jar'])
  26. compile 'com.android.support:appcompat-v7:19.1.0'
  27. }
  28. task addTest {
  29. def src = ['src/test/java']
  30. def file = file("app.iml")
  31. doLast {
  32. try {
  33. def parsedXml = (new XmlParser()).parse(file)
  34. def node = parsedXml.component[1].content[0]
  35. src.each {
  36. def path = 'file://$MODULE_DIR$/' + "${it}"
  37. def set = node.find { it.@url == path }
  38. if (set == null) {
  39. new Node(node,'sourceFolder',['url': 'file://$MODULE_DIR$/' + "${it}",'isTestSource': "true"])
  40. def writer = new StringWriter()
  41. new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml)
  42. file.text = writer.toString()
  43. }
  44. }
  45. } catch (FileNotFoundException e) {
  46. // nop,iml not found
  47. }
  48. }
  49. }
  50. gradle.projectsEvaluated {
  51. preBuild.dependsOn(addTest)
  52. }
  53. tasks.withType(Test) {
  54. scanForTestClasses = false
  55. include "**/*Test.class"
  56. }

这是我的测试应用类:

  1. public class NSApplicationTest extends NSApplication {
  2. @Override
  3. public Context getContext() {
  4. return mock(Context.class);
  5. }
  6. @Override
  7. public AlarmManager getAlarmManager() {
  8. return mock(AlarmManager.class);
  9. }
  10. }

这个配置的问题是任务addTest甚至加载NSApplicationTest类作为测试,并且它失败了:

  1. com.pack.scheduler.app.NSApplicationTest > initializationError Failed
  2. java.lang.Exception
  3. So I tried to change the name extension to see if this would fix everything but I'm still getting the same error. Then I tried with @Ignore on NSApplicationTest.
  4. Unable to load JUnit4 runner to calculate Ignored test cases
  5. java.lang.reflect.InvocationTargetException
  6. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  7. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
  8. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  9. at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
  10. at org.gradle.api.internal.tasks.testing.junit.AllExceptIgnoredTestRunnerBuilder$FallbackJUnit4Builder.runnerForClass(AllExceptIgnoredTestRunnerBuilder.java:52)
  11. at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
  12. at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
  13. at org.gradle.api.internal.tasks.testing.junit.IgnoredTestDescriptorProvider.getAllDescriptions(IgnoredTestDescriptorProvider.java:31)
  14. at org.gradle.api.internal.tasks.testing.junit.JUnitTestEventAdapter.processIgnoredClass(JUnitTestEventAdapter.java:104)
  15. at org.gradle.api.internal.tasks.testing.junit.JUnitTestEventAdapter.testIgnored(JUnitTestEventAdapter.java:92)
  16. at org.junit.runner.notification.RunNotifier$6.notifyListener(RunNotifier.java:175)
  17. at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:61)
  18. at org.junit.runner.notification.RunNotifier.fireTestIgnored(RunNotifier.java:172)
  19. at org.junit.internal.builders.IgnoredClassRunner.run(IgnoredClassRunner.java:16)
  20. at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
  21. at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
  22. at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)
  23. at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50)
  24. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  25. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  26. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  27. at java.lang.reflect.Method.invoke(Method.java:601)
  28. at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
  29. at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
  30. at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
  31. at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
  32. at $Proxy2.processTestClass(Unknown Source)
  33. at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:103)
  34. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  35. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  36. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  37. at java.lang.reflect.Method.invoke(Method.java:601)
  38. at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
  39. at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
  40. at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355)
  41. at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
  42. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
  43. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
  44. at java.lang.Thread.run(Thread.java:722)
  45. Caused by: org.junit.internal.runners.InitializationError
  46. at org.junit.internal.runners.MethodValidator.assertValid(MethodValidator.java:57)
  47. at org.junit.internal.runners.JUnit4ClassRunner.validate(JUnit4ClassRunner.java:47)
  48. at org.junit.internal.runners.JUnit4ClassRunner.

关于如何解决这个问题的任何想法?

最佳答案
您不需要编写自己的TestRunner.只需为测试应用程序类使用正确的命名方案:TestNSApplication(而不是NSApplicationTest)

我经常看到以下模式:

> *测试标记测试执行类
> Test *标记类扩展以使类可测试

我希望您已经知道此类必须与您的应用程序类具有相同的包.

猜你在找的Android相关文章