使用Espresso测试启动活动意图

3

我想进行一个简单的UI测试,测试一个按钮被按下并启动一个活动。

我已经尝试了基于这个文档(安卓开发者)。

SplashActivity的代码:

public class SplashActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    findViewById(R.id.launch_register_activity_btn).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(SplashActivity.this, RegisterActivity.class);
            startActivity(intent);
        }
    });
}
}

测试代码:

@RunWith(AndroidJUnit4.class)
public class SimpleIntentTest {

@Rule
public IntentsTestRule<SplashActivity> intentsRule = new IntentsTestRule<>(SplashActivity.class);

@Test
public void newActivityLaunchingTest() {


    onView(withId(R.id.launch_register_activity_btn)).perform(click());

    Log.i("register-package_name", RegisterActivity.class.getPackage().toString());
    Log.i("register-class_name", RegisterActivity.class.getName());
    Log.i("register-short_name", RegisterActivity.class.getSimpleName());


    intended(allOf(
            hasComponent(hasShortClassName(".RegisterActivity")),
            toPackage("re.example.common")
    ));


}
}

日志记录:

01-22 13:37:51.615: I/register-package_name(25292): package re.example.common, Unknown, version 0.0
01-22 13:37:51.615: I/register-class_name(25292): re.example.common.RegisterActivity
01-22 13:37:51.615: I/register-short_name(25292): RegisterActivity

包结构:

enter image description here

测试输出:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents.

IntentMatcher: (has component: has component with: class name: an instance of java.lang.String package name: an instance of java.lang.String short class name: is ".RegisterActivity" and resolvesTo: re.example.common)

Matched intents:[]

无论我怎么尝试,测试都无法验证我是否已经启动了RegisterActivity。测试失败了。
据我所知,我做的和上面链接中的espresso测试示例完全一样。
我做错了什么?
我还尝试过:
1. 从".RegisterActivity"中删除点号(.)。
intended(allOf(
            hasComponent(hasShortClassName("RegisterActivity")),
            toPackage("re.example.common")
    ));

2. 移除 ".RegisterActivity" 中的点号 (.) 并更改为 toPackage("re.example.common")

intended(allOf(
            hasComponent(hasShortClassName("RegisterActivity"))
    ));

我的RegisterActivity的包名是"re.example.common.RegisterActivity"。 它的简称"RegisterActivity",对吧?

为什么测试失败了?

这里发生了什么,我理解错了还是误解了什么?

提前感谢。


这个 Matched intents:[] 的出现表明 Espresso 没有记录任何意图。你是否尝试过稍微延迟一下,以排除 UI 线程同步的影响,只是为了测试这个理论?还有一个愚蠢的问题 - 如果手动测试,按钮实际上是否有效?最后一个问题是,你在哪个操作系统上运行测试? - Be_Negative
@Be_Negative,添加延迟不应该是必要的。Espresso的核心特点之一就是您无需在任何地方添加延迟(我已按照文档建议禁用了所有动画)。我已经手动测试过它可以正常工作,我正在使用我的真实设备小米Mi A1,Android 8.0进行测试。 - Adam Varhegyi
测试输出中没有“已记录意图”部分(您能否将该部分附加到您的问题上?)您是否尝试在这些匹配器上逐个匹配?同时,请确保您没有通过使用前缀、后缀等更改构建文件中应用程序的实际包名称。 - user
@AdamVarhegyi 这就是我说“只是为了测试理论”的原因。好的,这是我最后一次提问 - 你能否尝试在 API 26 以下的 API 上运行相同的代码?有一个开放问题 https://issuetracker.google.com/issues/37084501 针对 API 26,因此我还没有在任何更高版本上运行 intentstestrule。 - Be_Negative
1个回答

4

应用程序ID(应用程序包名称为)是:re.example(源Gradle)

该活动的完整名称为:re.example.common.RegisterActivity

这样,hasShortClassName 的意思是将 .common.RegisterActivity 作为短名称,而不是 .RegisterActivityRegisterActivity

嗯。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接