是否可以在@BeforeClass注释方法中运行Android Espresso单元测试?

时间:2016-01-24 21:30:27

标签: java android android-studio junit android-espresso

我在使用已检测的Android单元测试中使用 JUnit4 @BeforeClass注释时遇到问题(我使用 Espresso GUI测试库)。只要我使用@BeforeClass注释添加测试, Android Studio 1.5.1 就不会运行任何测试,而只是打印"空测试套件"。我没有使用测试套件。我搜索了这个网站和网站,但无法找到解决方案。我认为在@BeforeClass方法中调用的代码实际上失败(TDD)可能是一个问题,但是当在正常测试用例中工作的代码放入{时,这种错误甚至会发生。 {1}}带注释的方法。

谢谢。

更新:检查logcat输出后,正如一位评论者建议的那样,问题是问题是没有启动任何活动:未找到任何活动。您是否忘记通过拨打@BeforeClassgetActivity()或类似内容来启动活动?

我该怎么做?我无法使用startActivitySync字段,因为ActivityTestRule带注释的方法是静态的。

也许我只是以错误的方式使用@BeforeClass注释。我的印象是你可以使用这个注释在测试类中的所有其他测试之前执行测试。我基本上在这里寻找替换TestNG注释 @BeforeClass 。也许我最好在测试类上使用"dependsOnMethods"注释,并将第一个测试用例重命名为 @FixMethodOrder(MethodSorters.NAME_ASCENDING)

有人可以对此发表评论吗?感谢。

重新提出问题的标题。

aaa_my_testcase

build.app:

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();
    }

测试输出:

  

运行测试

     

测试运行beginFinish

     

空的测试套件。

Logcat输出:

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'
}

4 个答案:

答案 0 :(得分:16)

我有同样的问题,这只是因为规则, 您可以将活动设置为在规则构造函数中启动:

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

最后一个参数负责启动活动。

答案 1 :(得分:4)

讨厌看到这个问题没有答案。

所以,对于那些可能绊倒这个的人来说:

我的解决方案是在测试类上使用@FixMethodOrder(MethodSorters.NAME_ASCENDING)注释,并将第一个测试用例重命名为aaa_my_testcase

请参阅:MethodSortersFixMethodOrder

答案 2 :(得分:2)

我遇到了同样的问题,因为我测试的是独立片段而不是活动,我创建了FragmentTestRule扩展ActivityTestRule。我必须在每次测试中调用launchActivity()方法。

@Test
 public void recyclerViewItemClickTest() {

        mFragmentTestRule.launchActivity(null);
}

答案 3 :(得分:0)

@Rule 导致活动在每个单独的@Test 之前启动。要在静态 @BeforeClass 初始化方法中使用 Espresso,首先使用 ActivityScenario 显式启动活动。

@BeforeClass
public static void createTestData() {
    ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class);
    onView(withId(R.id.calibrationsButton)).perform(click());
    sharedCalibrationName = Utils.addTestCalibration(PREFIX, "200");
    scenario.close();
}