diff --git a/app/build.gradle b/app/build.gradle
index b99c16ec1..c4a97632e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -189,6 +189,16 @@ android {
         }
     }
 
+    sourceSets {
+        test {
+            java.srcDirs += "$projectDir/src/testShared/java"
+        }
+
+        androidTest {
+            java.srcDirs += "$projectDir/src/testShared/java"
+        }
+    }
+
     lintOptions {
         checkReleaseBuilds false
         abortOnError true
diff --git a/app/src/test/java/org/fdroid/fdroid/updater/RepoXMLHandlerTest.java b/app/src/test/java/org/fdroid/fdroid/updater/RepoXMLHandlerTest.java
index 193c8dc23..6f6eabc4e 100644
--- a/app/src/test/java/org/fdroid/fdroid/updater/RepoXMLHandlerTest.java
+++ b/app/src/test/java/org/fdroid/fdroid/updater/RepoXMLHandlerTest.java
@@ -28,23 +28,18 @@ import android.util.Log;
 
 import org.apache.commons.io.FileUtils;
 import org.fdroid.fdroid.BuildConfig;
-import org.fdroid.fdroid.RepoXMLHandler;
 import org.fdroid.fdroid.data.Apk;
 import org.fdroid.fdroid.data.App;
 import org.fdroid.fdroid.data.Repo;
 import org.fdroid.fdroid.data.RepoPushRequest;
-import org.fdroid.fdroid.mock.MockRepo;
+import org.fdroid.fdroid.mock.RepoDetails;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricGradleTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowLog;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
 
-import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -55,16 +50,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 // TODO: Use sdk=24 when Robolectric supports this
 @Config(constants = BuildConfig.class, sdk = 23)
@@ -835,41 +825,6 @@ public class RepoXMLHandlerTest {
         assertEquals(apks.size(), apkCount);
     }
 
-    private static class RepoDetails implements RepoXMLHandler.IndexReceiver {
-
-        public String name;
-        public String description;
-        public String signingCert;
-        public int maxAge;
-        public int version;
-        public long timestamp;
-
-        public List<Apk> apks = new ArrayList<>();
-        public List<App> apps = new ArrayList<>();
-        public List<RepoPushRequest> repoPushRequestList = new ArrayList<>();
-
-        @Override
-        public void receiveRepo(String name, String description, String signingCert, int maxage, int version, long timestamp) {
-            this.name = name;
-            this.description = description;
-            this.signingCert = signingCert;
-            this.maxAge = maxage;
-            this.version = version;
-            this.timestamp = timestamp;
-        }
-
-        @Override
-        public void receiveApp(App app, List<Apk> packages) {
-            apks.addAll(packages);
-            apps.add(app);
-        }
-
-        @Override
-        public void receiveRepoPushRequest(RepoPushRequest repoPushRequest) {
-            repoPushRequestList.add(repoPushRequest);
-        }
-    }
-
     @NonNull
     private RepoDetails getFromFile(String indexFilename) {
         return getFromFile(indexFilename, Repo.PUSH_REQUEST_IGNORE);
@@ -877,28 +832,9 @@ public class RepoXMLHandlerTest {
 
     @NonNull
     private RepoDetails getFromFile(String indexFilename, int pushRequests) {
-        try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setNamespaceAware(true);
-            SAXParser parser = factory.newSAXParser();
-            XMLReader reader = parser.getXMLReader();
-            RepoDetails repoDetails = new RepoDetails();
-            MockRepo mockRepo = new MockRepo(100, pushRequests);
-            RepoXMLHandler handler = new RepoXMLHandler(mockRepo, repoDetails);
-            reader.setContentHandler(handler);
-            Log.i(TAG, "test file: " + getClass().getClassLoader().getResource(indexFilename));
-            InputStream input = getClass().getClassLoader().getResourceAsStream(indexFilename);
-            InputSource is = new InputSource(new BufferedInputStream(input));
-            reader.parse(is);
-            return repoDetails;
-        } catch (ParserConfigurationException | SAXException | IOException e) {
-            e.printStackTrace();
-            fail();
-
-            // Satisfies the compiler, but fail() will always throw a runtime exception so we never
-            // reach this return statement.
-            return null;
-        }
+        Log.i(TAG, "test file: " + getClass().getClassLoader().getResource(indexFilename));
+        InputStream inputStream = getClass().getClassLoader().getResourceAsStream(indexFilename);
+        return RepoDetails.getFromFile(inputStream, pushRequests);
     }
 
     private void writeResourceToObbDir(String assetName) throws IOException {
diff --git a/app/src/test/java/org/fdroid/fdroid/mock/MockRepo.java b/app/src/testShared/java/org/fdroid/fdroid/mock/MockRepo.java
similarity index 100%
rename from app/src/test/java/org/fdroid/fdroid/mock/MockRepo.java
rename to app/src/testShared/java/org/fdroid/fdroid/mock/MockRepo.java
diff --git a/app/src/testShared/java/org/fdroid/fdroid/mock/RepoDetails.java b/app/src/testShared/java/org/fdroid/fdroid/mock/RepoDetails.java
new file mode 100644
index 000000000..4371bbaa4
--- /dev/null
+++ b/app/src/testShared/java/org/fdroid/fdroid/mock/RepoDetails.java
@@ -0,0 +1,85 @@
+package org.fdroid.fdroid.mock;
+
+import android.support.annotation.NonNull;
+
+import org.fdroid.fdroid.RepoXMLHandler;
+import org.fdroid.fdroid.data.Apk;
+import org.fdroid.fdroid.data.App;
+import org.fdroid.fdroid.data.RepoPushRequest;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import static org.junit.Assert.fail;
+
+public class RepoDetails implements RepoXMLHandler.IndexReceiver {
+    public static final String TAG = "RepoDetails";
+
+    public String name;
+    public String description;
+    public String signingCert;
+    public int maxAge;
+    public int version;
+    public long timestamp;
+
+    public List<Apk> apks = new ArrayList<>();
+    public List<App> apps = new ArrayList<>();
+    public List<RepoPushRequest> repoPushRequestList = new ArrayList<>();
+
+    @Override
+    public void receiveRepo(String name, String description, String signingCert, int maxage, int version, long timestamp) {
+        this.name = name;
+        this.description = description;
+        this.signingCert = signingCert;
+        this.maxAge = maxage;
+        this.version = version;
+        this.timestamp = timestamp;
+    }
+
+    @Override
+    public void receiveApp(App app, List<Apk> packages) {
+        apks.addAll(packages);
+        apps.add(app);
+    }
+
+    @Override
+    public void receiveRepoPushRequest(RepoPushRequest repoPushRequest) {
+        repoPushRequestList.add(repoPushRequest);
+    }
+
+    @NonNull
+    public static RepoDetails getFromFile(InputStream inputStream, int pushRequests) {
+        try {
+            SAXParserFactory factory = SAXParserFactory.newInstance();
+            factory.setNamespaceAware(true);
+            SAXParser parser = factory.newSAXParser();
+            XMLReader reader = parser.getXMLReader();
+            RepoDetails repoDetails = new RepoDetails();
+            MockRepo mockRepo = new MockRepo(100, pushRequests);
+            RepoXMLHandler handler = new RepoXMLHandler(mockRepo, repoDetails);
+            reader.setContentHandler(handler);
+            InputSource is = new InputSource(new BufferedInputStream(inputStream));
+            reader.parse(is);
+            return repoDetails;
+        } catch (ParserConfigurationException | SAXException | IOException e) {
+            e.printStackTrace();
+            fail();
+
+            // Satisfies the compiler, but fail() will always throw a runtime exception so we never
+            // reach this return statement.
+            return null;
+        }
+    }
+
+}
+