2015-07-26 2 views
5

Я часто нахожу, что дублирую точный набор тестовых классов, таких как mocks или помощники для тестов Android /androidTest и модульных тестов /test при написании тестов для прикладного модуля.Как создать тестовые классы, которые можно использовать в тестах Android и модульных тестах?

Например, у меня есть некоторые статические функции, которые помогают мне создавать издевается быстро /test/MockUtils.java Однако, я не могу повторно использовать этот вспомогательный класс в любом из моих Android тестов, потому что они не разделяют один и тот же путь к классу - /androidTest против /test.

Я думал о создании нового модуля, который содержит только тестовые ресурсы. Однако эта идея не будет летать, потому что плагин Android Gradle отказывается от зависимости от модуля приложения.

проект testCommon разрешает архив APK, который не поддерживается как зависимость от компиляции.

Есть ли другой способ создания тестовых классов, которые могут быть повторно использованы в тестах на Android и модульных тестах?

+0

Подробнее здесь: [Обмен коды между модульными тестами и инструментальными тестами на Android] (http://blog.danlew.net/2015/11/02/sharing - код-между-unit-tests-and-instrumentation-tests-on-android /), [код обмена между инструментами и модульными тестами] (https://gerrit.wikimedia.org/r/#/c/238184/1 /app/build.gradle) – JJD

ответ

6

ПРИМЕЧАНИЕ. Это теоретическое решение, которое я не пробовал.

Шаг №1: Создайте в своем модуле каталог testSrc/, для которого вы пытаетесь настроить общий тестовый код.

Шаг # 2: Поместите общий код в этот каталог (с соответствующими подкаталогами на основе пакета Java).

Шаг 3: Добавьте после закрытия внутри android закрытия в build.gradle файле вашего модуля:

sourceSets { 
    androidTest { 
     java.srcDirs <<= 'testSrc' 
    } 

    test { 
     java.srcDirs <<= 'testSrc' 
    } 
} 

Что это должно сделать, это сказать Gradle для Android, что testSrc является другой исходный каталог для Java кода в androidTest и test источников.

+0

Мне пришлось изменить ваше решение, потому что по какой-то причине функция leftShift не работает. Я должен был переделать пути вместо 'test { java.srcDirs = ['src/test', 'testSrc'] }' Можете ли вы изменить свое решение, чтобы я мог его принять? –

+0

@SomeNoobStudent: Каковы были ваши конкретные симптомы с помощью оператора с левым сменом?Я только что создал новый проект, выполнил шаги в своем ответе, сделал синхронизацию файлов Gradle в Android Studio, и у меня не было никаких ошибок сборки. Я даже смог запустить тесты, хотя и с пустым каталогом 'testSrc /'. – CommonsWare

+0

Я на 'IntelliJ 14.1.4/Plugin 1.2.3/Gradle 2.4-all' и используя' <<' имеет 0 эффект - IDE не выделяет зеленый путь, а классы внутри него игнорируются, не позволяя мне ссылаться на них в моих тестах. –

4

Исходя из решения CommonsWare и https://code.google.com/p/android/issues/detail?id=181391, правильным способом добавления дополнительного пути класса является использование операторов += или <<=.

sourceSets { 
    androidTest { 
     java.srcDirs <<= 'testSrc' 
    } 

    test { 
     java.srcDirs += 'testSrc' 
    } 
} 
0

Решение, описанное ниже в блоге, помогло мне.

http://blog.danlew.net/2015/11/02/sharing-code-between-unit-tests-and-instrumentation-tests-on-android/

Я положил общий тестовый код в SRC/sharedTest/Java. Затем я добавил следующий код build.gradle:

<pre> 
android { 
    sourceSets { 
    String sharedTestDir = 'src/sharedTest/java' 
    test { 
     java.srcDir sharedTestDir 
    } 
    androidTest { 
     java.srcDir sharedTestDir 
    } 
    } 
} 
</pre> 
Смежные вопросы