Intereting Posts
В чем разница между стилем TextView и атрибутами android: textAppearance? Android и SQLite: когда использовать точки с запятой для завершения операторов? Mvn android: развертывание не работает (несмотря на подтверждение успеха) Как избежать одновременного нажатия нескольких кнопок на Android? Проверьте, подключено ли приложение Android к серверу, которое вы сделали Android – невозможно вызвать setOnItemClickListener из списка ListView Ресурс Android @style не разрешен Анимированный фон, напоминающий приложение для будильника Получение сенсорных координат неточно в ImageView FloodFill Algorithm Правильно определить тип устройства Android Слайд-анимация xml для изменения активности в android Предотвращение HttpClient 4 из следующего перенаправления Android: SwipeListView – не отвечает на салфетки, но работает над кликом. Ясность видео с моим кодом немного ниже по сравнению с записью с камерой Android Зеленые изображения при выполнении кодировки JPEG из YUV_420_888 с использованием новой камеры Android2 api

Можно ли запускать тесты модулей Android Espresso в аннотированных методах @BeforeClass?

У меня проблема с использованием аннотации JUnit4 @BeforeClass в инструментальном блоке Android (я использую библиотеку тестирования Espresso GUI). Как только я добавлю тест с аннотацией @BeforeClass , Android Studio 1.5.1 вообще не запускает никаких тестов, а просто печатает «Empty test suite». Я не использую набор тестов. Я искал этот сайт и в Интернете, но не смог найти решение. Я думал, что может быть проблемой, что код, который вызывается в методе @BeforeClass действительно терпит неудачу (TDD), но эта ошибка возникает даже тогда, когда код, который работает в обычных тестовых случаях, помещается в аннотированный метод @BeforeClass ,

Спасибо.

ОБНОВЛЕНИЕ: после проверки вывода logcat, как предложил один комментатор, кажется, что проблема в том, что проблема в том, что никакая активность не была запущена: никаких действий не найдено. Вы забыли запустить эту деятельность, вызвав getActivity() или startActivitySync или подобное?

Как мне это сделать? Я не могу использовать поле ActivityTestRule , поскольку аннотированный метод @BeforeClass является статическим.

Возможно, я просто использую аннотацию @BeforeClass неправильно. Мое впечатление заключалось в том, что вы можете использовать эту аннотацию для выполнения тестов перед всеми другими тестами в тестовом классе. Я в основном искал замену аннотации TestNG "dependsOnMethods" здесь. Возможно, мне лучше использовать аннотацию @FixMethodOrder(MethodSorters.NAME_ASCENDING) в тестовом классе и переименовать первый тестовый пример в aaa_my_testcase .

Может кто-нибудь прокомментировать это? Благодарю.

Перефразировал название вопроса.

 import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.Espresso.pressBack; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.not; @RunWith(AndroidJUnit4.class) public class MainActivityTest { @Rule public ActivityTestRule<MainActivity> menuActivityTestRule = new ActivityTestRule<>(MainActivity.class); private static void checkSignBrowserIsDisplayed() { onView(withText(R.string.sign_browser)).check(matches(isDisplayed())); } @BeforeClass public static void checkSignBrowserIsDisplayedOnAppStartup() { checkSignBrowserIsDisplayed(); } 

build.app:

 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "foo" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true } } testOptions { unitTests.returnDefaultValues = true } } dependencies { testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'junit:junit:4.12' androidTestCompile 'junit:junit:4.12' androidTestCompile 'com.android.support:support-annotations:23.1.1' androidTestCompile 'com.android.support.test:runner:0.4.1' androidTestCompile 'com.android.support.test:rules:0.4.1' androidTestCompile 'org.hamcrest:hamcrest-library:1.3' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' // required if you want to use Mockito for Android instrumentation tests - not needed now. // androidTestCompile 'org.mockito:mockito-core:1.+' // androidTestCompile "com.google.dexmaker:dexmaker:1.2" // androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2" compile fileTree(include: ['*.jar'], dir: 'libs') compile 'org.apache.commons:commons-lang3:3.4' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' } 

Выход теста:

Тестирование

Тестирование запущеноFinish

Пустой набор тестов.

Выход Logcat:

 01-25 10:22:42.746 22098-22118/foo I/TestRunner: run started: 5 tests 01-25 10:22:42.764 22098-22118/foo D/InputManagerEventInjectionStrategy: Creating injection strategy with input manager. 01-25 10:22:42.890 22098-22118/foo I/TestRunner: failed: foo.MainActivityTest 01-25 10:22:42.890 22098-22118/foo I/TestRunner: ----- begin exception ----- 01-25 10:22:42.891 22098-22118/foo I/TestRunner: java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar? at android.support.test.espresso.base.RootViewPicker.waitForAtLeastOneActivityToBeResumed(RootViewPicker.java:189) at android.support.test.espresso.base.RootViewPicker.findRoot(RootViewPicker.java:134) at android.support.test.espresso.base.RootViewPicker.get(RootViewPicker.java:80) at android.support.test.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:69) at android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:23) at android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:9) at android.support.test.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:68) at android.support.test.espresso.ViewInteraction$2.run(ViewInteraction.java:166) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5312) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 01-25 10:22:42.891 22098-22118/foo I/TestRunner: ----- end exception ----- 01-25 10:22:42.891 22098-22118/foo I/TestRunner: failed: Test mechanism 01-25 10:22:42.892 22098-22118/foo I/TestRunner: ----- begin exception ----- 01-25 10:22:42.892 22098-22118/foo I/TestRunner: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putString(java.lang.String, java.lang.String)' on a null object reference at android.support.test.internal.runner.listener.InstrumentationResultPrinter.reportFailure(InstrumentationResultPrinter.java:183) at android.support.test.internal.runner.listener.InstrumentationResultPrinter.testFailure(InstrumentationResultPrinter.java:173) at org.junit.runner.notification.SynchronizedRunListener.testFailure(SynchronizedRunListener.java:63) at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:142) at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72) at org.junit.runner.notification.RunNotifier.fireTestFailures(RunNotifier.java:138) at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:132) at org.junit.internal.runners.model.EachTestNotifier.addFailure(EachTestNotifier.java:23) at org.junit.runners.ParentRunner.run(ParentRunner.java:369) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) 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.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54) at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1928) 

У меня была такая же проблема, и только из-за правила вы можете установить действие для запуска в конструкторе правила:

 @Rule public ActivityTestRule<MainActivity> menuActivityTestRule = new ActivityTestRule<>(MainActivity.class, true, true); 

Последний аргумент отвечает за запуск этой активности.

Ненавижу, чтобы этот вопрос остался без ответа.

Итак, для всех, кто может наткнуться на это:

Моим решением было использовать аннотацию @FixMethodOrder(MethodSorters.NAME_ASCENDING) в тестовом классе и переименовать первый тестовый пример в aaa_my_testcase .

См. Метод MethodSorters , FixMethodOrder .

У меня была такая же проблема, потому что я тестировал отдельные фрагменты, а не активность, я создал FragmentTestRule расширяя ActivityTestRule . И я должен вызвать launchActivity() в каждом тесте.

 @Test public void recyclerViewItemClickTest() { mFragmentTestRule.launchActivity(null); }