2016-09-06 14 views
6

私たちは内部のNexusリポジトリからの依存関係org.robolectric:robolectric:3.0を使用しようとしています。問題は、Robolectricが実行時にパブリックリポジトリ(as mentioned here)からいくつかの依存関係をロードしようとし、build.gradle内のリポジトリオーバーライドを無視することです。Robolectricランタイム依存関係リポジトリのURLを上書きする方法は?

私たちは私たちのイントラネットからの公共の場所へのアクセスを持っていないので、私のテストは、その依存関係をロードしようとした後、タイムアウト:

[WARNING]リソース を取得できません「org.robolectric:android- エラーファイル転送:操作は

をタイムアウトしRobolectric configuration documentationの底部分は、あなたのGradle configuratioにこれを追加することをお勧めします リポジトリsonatype(https://oss.sonatype.org/content/groups/public/)から5.0.0_r2-robolectric-1' :すべて:jarファイルn:URLを上書きする:

android { 
    testOptions { 
    unitTests.all { 
     systemProperty 'robolectric.dependency.repo.url', 'https://local-mirror/repo' 
     systemProperty 'robolectric.dependency.repo.id', 'local' 
    } 
    } 
} 

残念ながら、私はそれをテストしましたが、設定されているシステムプロパティは表示されません。私は自分のカスタムRobolectricランナー(RobolectricGradleTestRunnerを拡張しています)の中からそれを印刷しました。そのシステムプロパティはnullのままです。

System.out.println("robolectric.dependency.repo.url: " + System.getProperty("robolectric.dependency.repo.url")); 

は私も this commentに似た何かをしようとした(が、その方法は RobolectricGradleTestRunnerに上書きするために存在していない)、と私はまた私のカスタムRobolectricランナーに直接システムプロパティを設定してみました、それはしませんでした助けてくれるようです。

@Config(constants = BuildConfig.class) 
public class CustomRobolectricRunner extends RobolectricGradleTestRunner { 
    private static final String BUILD_OUTPUT = "build/intermediates"; 

    public CustomRobolectricRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 

     System.setProperty("robolectric.dependency.repo.url", "https://nexus.myinternaldomain.com/content"); 
     System.setProperty("robolectric.dependency.repo.id", "internal"); 

     System.out.println("robolectric.dependency.repo.url: " + System.getProperty("robolectric.dependency.repo.url")); 
    } 

Robolectric source codeは、これらのシステムプロパティが存在することを確認しているようです。

答えて

7

、仕事にこれを取得する別の方法はRobolectricTestRunnerサブクラスでgetJarResolver()をオーバーライドして、アーティファクトのホストでそれを指し示すことによって、直接のプロパティを使用するためではない修正ですが:

public final class MyTestRunner extends RobolectricTestRunner { 
    public MyTestRunner(Class<?> testClass) throws InitializationError { 
    super(testClass); 
    } 

    @Override protected DependencyResolver getJarResolver() { 
    return new CustomDependencyResolver(); 
    } 

    static final class CustomDependencyResolver implements DependencyResolver { 
    private final Project project = new Project(); 

    @Override public URL[] getLocalArtifactUrls(DependencyJar... dependencies) { 
     DependenciesTask dependenciesTask = new DependenciesTask(); 
     RemoteRepository repository = new RemoteRepository(); 
     repository.setUrl("https://my-nexus.example.com/content/groups/public"); 
     repository.setId("my-nexus"); 
     dependenciesTask.addConfiguredRemoteRepository(repository); 
     dependenciesTask.setProject(project); 
     for (DependencyJar dependencyJar : dependencies) { 
     Dependency dependency = new Dependency(); 
     dependency.setArtifactId(dependencyJar.getArtifactId()); 
     dependency.setGroupId(dependencyJar.getGroupId()); 
     dependency.setType(dependencyJar.getType()); 
     dependency.setVersion(dependencyJar.getVersion()); 
     if (dependencyJar.getClassifier() != null) { 
      dependency.setClassifier(dependencyJar.getClassifier()); 
     } 
     dependenciesTask.addDependency(dependency); 
     } 
     dependenciesTask.execute(); 

     @SuppressWarnings("unchecked") 
     Hashtable<String, String> artifacts = project.getProperties(); 
     URL[] urls = new URL[dependencies.length]; 
     for (int i = 0; i < urls.length; i++) { 
     try { 
      urls[i] = Util.url(artifacts.get(key(dependencies[i]))); 
     } catch (MalformedURLException e) { 
      throw new RuntimeException(e); 
     } 
     } 
     return urls; 
    } 

    @Override public URL getLocalArtifactUrl(DependencyJar dependency) { 
     URL[] urls = getLocalArtifactUrls(dependency); 
     if (urls.length > 0) { 
     return urls[0]; 
     } 
     return null; 
    } 

    private String key(DependencyJar dependency) { 
     String key = 
      dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getType(); 
     if (dependency.getClassifier() != null) { 
     key += ":" + dependency.getClassifier(); 
     } 
     return key; 
    } 
    } 
} 

それは、このことに留意すべきですRobolectricの2つの内部クラスに依存しているので、バージョンをアップグレードするときは注意が必要です。

+1

私は、リポジトリへの資格情報の追加に関するこのフォローアップの質問があります。https://stackoverflow.com/questions/47232275/how-to-add-credentials-to-the-dependencyresolver-used-by-robolectric – yiati

3

プロパティmavenRepositoryIdmavenRepositoryUrlRoboSettingsで、これはMavenDependencyResolverによって使用されます。

例:linked Github issue 1として

public class CustomRobolectricRunner extends RobolectricGradleTestRunner { 

    static { 
     RoboSettings.setMavenRepositoryId("my-nexus"); 
     RoboSettings.setMavenRepositoryUrl("https://my-nexus.example.com/content/groups/public"); 
    } 


    ... 
} 
1

、1つのフィックスがあなたの~\.m2フォルダにsettings.xmlを設定することです:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 
    <mirrors> 
     <mirror> 
      <id>jcenter</id> 
      <name>JCenter Remote</name> 
      <mirrorOf>*</mirrorOf> 
      <url>https://www.example.com/artifactory/jcenter-remote/</url> 
     </mirror> 
    </mirrors> 
</settings> 

<mirrorOf>*</mirrorOf>はにすべてのリポジトリの要求をリダイレクトするためにMavenを強制するために必要と思われます1つのリモート。 Mavenのミラー設定の詳細については、hereを参照してください。

Sonatypeのリモートを使用するだけでは不十分であることが判明した場合、推移的な依存関係をすべて取得するには、JCenterまたはMaven Centralのリモートを使用する必要があります。

関連する問題