【问题标题】:Run Android test with Robolectric - dependency error使用 Robolectric 运行 Android 测试 - 依赖错误
【发布时间】:2015-07-08 12:24:05
【问题描述】:

我使用的是 Android Studio 1.2 和 Windows 7

当按照example 运行机器人测试时:

@RunWith(CustomRobolectricRunner.class)
@Config(emulateSdk = 21, reportSdk = 21, constants = BuildConfig.class)
public class PasswordProviderTest{

    @Test
    public void testGetPassword() throws Exception {
        Activity activity = Robolectric.setupActivity(LoginActivity.class);
    }

    @Test
    public void testSetPassword() throws Exception {

    }
}

测试结果或更多错误堆栈跟踪:

    Unable to resolve artifact: Unable to get dependency information: Unable to read the metadata file for artifact 'org.robolectric:android-all:jar': Cannot find parent: org.sonatype.oss:oss-parent for project: org.robolectric:android-all:jar:5.0.0_r2-robolectric-1 for project org.robolectric:android-all:jar:5.0.0_r2-robolectric-1
  org.robolectric:android-all:jar:5.0.0_r2-robolectric-1

from the specified remote repositories:
  sonatype (https://oss.sonatype.org/content/groups/public/),
  central (http://repo1.maven.org/maven2)

Path to dependency: 
    1) org.apache.maven:super-pom:pom:2.0


    at org.apache.maven.artifact.ant.DependenciesTask.doExecuteResolution(DependenciesTask.java:268)
    at org.apache.maven.artifact.ant.DependenciesTask.doExecute(DependenciesTask.java:168)
    at org.apache.maven.artifact.ant.AbstractArtifactTask.execute(AbstractArtifactTask.java:751)
    at org.robolectric.internal.dependency.MavenDependencyResolver.getLocalArtifactUrls(MavenDependencyResolver.java:40)
    at org.robolectric.internal.dependency.CachedDependencyResolver.getLocalArtifactUrls(CachedDependencyResolver.java:42)
    at org.robolectric.RobolectricTestRunner.createRobolectricClassLoader(RobolectricTestRunner.java:151)
    at org.robolectric.RobolectricTestRunner.createSdkEnvironment(RobolectricTestRunner.java:122)
    at org.robolectric.RobolectricTestRunner$3.create(RobolectricTestRunner.java:285)
    at org.robolectric.internal.EnvHolder.getSdkEnvironment(EnvHolder.java:18)
    at org.robolectric.RobolectricTestRunner.getEnvironment(RobolectricTestRunner.java:283)
    at org.robolectric.RobolectricTestRunner.access$300(RobolectricTestRunner.java:50)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:193)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:168)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:105)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.maven.artifact.resolver.ArtifactResolutionException: Unable to get dependency information: Unable to read the metadata file for artifact 'org.robolectric:android-all:jar': Cannot find parent: org.sonatype.oss:oss-parent for project: org.robolectric:android-all:jar:5.0.0_r2-robolectric-1 for project org.robolectric:android-all:jar:5.0.0_r2-robolectric-1
  org.robolectric:android-all:jar:5.0.0_r2-robolectric-1

from the specified remote repositories:
  sonatype (https://oss.sonatype.org/content/groups/public/),
  central (http://repo1.maven.org/maven2)

Path to dependency: 
    1) org.apache.maven:super-pom:pom:2.0


    at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:430)
    at org.apache.maven.artifact.resolver.DefaultArtifactCollector.collect(DefaultArtifactCollector.java:74)
    at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolveTransitively(DefaultArtifactResolver.java:316)
    at org.apache.maven.artifact.ant.DependenciesTask.doExecuteResolution(DependenciesTask.java:263)
    ... 46 more
Caused by: org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException: Unable to read the metadata file for artifact 'org.robolectric:android-all:jar': Cannot find parent: org.sonatype.oss:oss-parent for project: org.robolectric:android-all:jar:5.0.0_r2-robolectric-1 for project org.robolectric:android-all:jar:5.0.0_r2-robolectric-1
    at org.apache.maven.project.artifact.MavenMetadataSource.retrieveRelocatedProject(MavenMetadataSource.java:200)
    at org.apache.maven.project.artifact.MavenMetadataSource.retrieveRelocatedArtifact(MavenMetadataSource.java:94)
    at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:387)
    ... 49 more
Caused by: org.apache.maven.project.ProjectBuildingException: Cannot find parent: org.sonatype.oss:oss-parent for project: org.robolectric:android-all:jar:5.0.0_r2-robolectric-1 for project org.robolectric:android-all:jar:5.0.0_r2-robolectric-1
    at org.apache.maven.project.DefaultMavenProjectBuilder.assembleLineage(DefaultMavenProjectBuilder.java:1396)
    at org.apache.maven.project.DefaultMavenProjectBuilder.buildInternal(DefaultMavenProjectBuilder.java:823)
    at org.apache.maven.project.DefaultMavenProjectBuilder.buildFromRepository(DefaultMavenProjectBuilder.java:255)
    at org.apache.maven.project.artifact.MavenMetadataSource.retrieveRelocatedProject(MavenMetadataSource.java:163)
    ... 51 more
Caused by: org.apache.maven.project.ProjectBuildingException: POM 'org.sonatype.oss:oss-parent' not found in repository: Unable to download the artifact from any repository

  org.sonatype.oss:oss-parent:pom:7

from the specified remote repositories:
  sonatype (https://oss.sonatype.org/content/groups/public/),
  central (http://repo1.maven.org/maven2)

 for project org.sonatype.oss:oss-parent
    at org.apache.maven.project.DefaultMavenProjectBuilder.findModelFromRepository(DefaultMavenProjectBuilder.java:605)
    at org.apache.maven.project.DefaultMavenProjectBuilder.assembleLineage(DefaultMavenProjectBuilder.java:1392)
    ... 54 more
    Caused by: org.apache.maven.artifact.resolver.ArtifactNotFoundException: Unable to download the artifact from any repository

      org.sonatype.oss:oss-parent:pom:7

    from the specified remote repositories:
      sonatype (https://oss.sonatype.org/content/groups/public/),
      central (http://repo1.maven.org/maven2)


        at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:228)
        at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:90)
        at org.apache.maven.pr

oject.DefaultMavenProjectBuilder.findModelFromRepository(DefaultMavenProjectBuilder.java:558)
    ... 55 more
Caused by: org.apache.maven.wagon.ResourceDoesNotExistException: Unable to download the artifact from any repository
    at org.apache.maven.artifact.manager.DefaultWagonManager.getArtifact(DefaultWagonManager.java:404)
    at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:216)
    ... 57 more

gradle 构建依赖:

testCompile 'junit:junit:4.12'
testCompile "org.mockito:mockito-core:1.9.5"
testCompile 'org.apache.maven:maven-ant-tasks:2.1.3'
testCompile "org.robolectric:robolectric:3.0-rc2"

我发现资源,robolectric 尝试获取,不可用。当关注 url 时,它会尝试获取它:https://oss.sonatype.org/content/groups/public/org/sonatype/oss/oss-parent/

没有oss 7. 为什么robolectrics 会尝试获取不存在的资源?以及如何让它工作?

【问题讨论】:

  • 我猜这是Robolectric用来进行实际测试的AOSP jar
  • 这对我的问题意味着什么?
  • 啊,对不起,我读到“为什么它正在下载不在我的构建 gradle 文件中的依赖项”。而这种依赖实际上可以通过 maven Central (search.maven.org/…) 获得。那么您可能有防火墙或代理问题
  • 是的,我有一个 unremovalbe 代理....但我还告诉的是,在查找资源时,该资源不存在
  • 它在 sonatype 存储库中不存在,但在 maven Central 中存在

标签: android robolectric


【解决方案1】:

这似乎是代理问题。在代理后面时,您必须在 {userHome}/.m2/settings.xml

指定 maven 的代理设置

我的 settings.xml 现在看起来像:

<settings>
    <proxies>
        <proxy>
            <active>true</active>
            <host>proxy.host</host>
            <port>3128</port>
        </proxy>
    </proxies>
</settings>

下面不工作!!

<settings>
    <proxies>
        <proxy>
            <id>proxy-https</id>
            <active>true</active>
            <protocol>https</protocol>
            <host>proxy.host</host>
            <port>3128</port>
        </proxy>
        <proxy>
            <id>proxy-http</id>
            <active>true</active>
            <protocol>http</protocol>
            <host>proxy.host</host>
            <port>3128</port>
        </proxy>
    </proxies>
</settings>

【讨论】:

  • 所以你明白了吗?测试现在运行吗?
  • 也许有人能告诉我为什么第一个有效而第二个无效...?
  • 如果您曾经创建“集成”测试并且必须在代理后面使用 HTTP 请求,请发布另一个有用的答案!
  • 我使用的是 Robolectric 3.0 版,依赖 jar 是从我的存储库下载的,而不是 sonatype。
【解决方案2】:

我已经能够通过覆盖 Robolectric Maven 存储库 URL 来解决相同的问题。

由于某种原因,Sonatype 不可用,Maven Central 从 2020 年 1 月 15 日开始迁移到 HTTPS。因此,我决定使用 Maven Central URL,但采用安全方案。

编辑 Robolectric RoboSettings 类使用的系统属性允许我使用不同的 URL。

android {
    testOptions {
        unitTests.all {
            systemProperty 'robolectric.dependency.repo.url', 'https://repo1.maven.org/maven2'
        }
    }
}

【讨论】:

  • 它仅适用于 Robolectric 4.0+,请检查此提交添加这些系统属性:github.com/robolectric/robolectric/commit/…
  • @Pawel 这不正确。您的提交添加了其他道具,但问题中的道具是 4 年前在 3.1 中添加的:github.com/robolectric/robolectric/commit/…
  • 它对我不起作用。仍然 android studio 尝试从 Sonatype 下载并失败。 “下载:org/robolectric/android-all/4.1.2_r1-robolectric-r1/android-all-4.1.2_r1-robolectric-r1.pom 从存储库 sonatype oss.sonatype.org/content/groups/public 传输文件时出错:连接超时:连接 [警告] 无法从存储库 sonatype (oss.sonatype.org/content/groups/public) 获取资源 'org.robolectric:android-all:pom:4.1.2_r1-robolectric-r1':传输文件时出错:连接超时:连接“
  • @SandeepCg 几个小时前遇到了同样的事情,但目前它已恢复正常,我已经执行了两次测试执行并且都成功通过了,似乎是 Sonatype repo 的临时连接问题,呵呵
【解决方案3】:

我在使用 JRE 11 运行 Robolectric 测试时遇到此错误。

转到运行/调试配置并将其更改为 JRE 1.8 可能会解决您的问题。

第 1 步: Run/Debug Configurations

第 2 步: Change JRE

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2016-11-16
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多