2015-01-30 2 views
4

Итак, я получаю NoSuchMethodError при запуске моих тестов Activity/Instrument из Android Studio, на кодовой строке, которая пытается вызвать метод в библиотечном модуле из модульного теста.Android Instrumentation test не находит классы из проекта библиотеки

Так что это мой тест:

public class MainActivityTest extends ActivityInstrumentationTestCase2 { 
    public void testMainActivity() { 
     final MainActivity target = (MainActivity) getActivity(); 
     MyLibarary.someStaticMethod(); // yields java.lang.NoSuchMethodError 
} 

Что же здесь дело? Я определил свою библиотеку как «компилирую» -зависимость в build.gradle, и она компилируется просто отлично. Библиотека также вызывается из основных классов приложений без проблем. Только когда я вызываю это из тестов, он терпит неудачу. Мое приложение и мои тесты находятся в одном модуле.

Я попытался выполнить чистую задачу, выполнить сборкуДебуг и собрать задачиDebugTest вручную. Безрезультатно.

Структура проекта:

Root 
|---MyApp 
|  |---src/main/... 
|  |---src/androidTest/... 
|----MyLibrary 

Запуск Android Студия v1.0.2 Gradle строить инструменты v1.0.0 Запуск в качестве "Test Android" на модуле "MyApp" из Run/Debug конфигурации AS с присвоенным Контрольно-измерительный прибор.

+1

В Eclipse >> свойства проекта >> Android >> убедитесь, что проект, который вы тестируете, ссылается в разделе «Библиотека». 'is library' может оставаться непроверенным –

+0

На самом деле это не называется ни одним из них - я анонимизировал код для SO. Но это не проблема - код не был бы скомпилирован, если бы у меня была синтаксическая ошибка. Он компилируется, но не работает. – Nilzor

+0

Извините, я редактировал свой комментарий, пока вы отвечали. Большинство сообщений на эту тему говорят, что вы находите две версии библиотеки, один раз во время компиляции, а другой во время выполнения. –

ответ

7

Хорошо это один было немного сложнее. Ключевое слово: proguard minify. С тех пор, как недавно внедренный метод только был использован контрольно-измерительным тестом, proguard не зацепился за его использование и поэтому удалил его из DEX на этапе сборки proguardDebugTest.

Решение: Либо отключите миниатюру в сборке отладки (в градиенте: android.buildTypes.debug.minifyEnabled false), либо используйте метод в главном приложении.

+0

ahh interesting. Не выпустил метод, вызывающий проблему, не был связан с InstrumentTestCase. Хороший улов! – user2511882

1

Не актуально с Gradle. Но я думаю, что мы должны указать testCompile или androidTestCompile, а также в build.gradle, если пытаетесь написать контрольно-измерительные тесты.

Полезных ссылки:

http://gradle.org/docs/current/userguide/java_plugin.html

Specifying test dependencies with the Gradle Android build system

Надеется, что это помогает

+0

Предполагается, что только указанные зависимости * exlusive * к тестам, например junit, должны быть указаны таким образом. Мое основное приложение уже имеет зависимость от «компиляции» с библиотекой, поэтому нет необходимости ссылаться на нее снова.Решение было связано с proguard, хотя - см. Мой другой ответ – Nilzor

Смежные вопросы