如何测试/模拟NFC前台调度?

时间:2014-05-19 18:49:22

标签: android testing android-fragments nfc foreground

我知道你可以简单地通过创建一个意图并开始和活动来模拟NFC标签。根据我的理解和测试,只有在清单中添加了intent-filters时才有效。

我想模拟标记并仅通过前台调度将它们分发到活动/片段,因此在清单中使用intent-filters启动活动不是一个选项对我来说。

我的程序结构如下所示:Activity - >几个片段,其中一个片段通过前台调度对NFC标签感兴趣。 nfc-fragment具有pendingIntent和dispatch-enabled和-disabling的必要代码。 该活动实现onNewIntent()方法,如果nfc片段处于活动状态,则通过nfc-fragment中的方法调用intent的进一步处理。

该程序运行正常,但我需要使用自动化测试来测试行为。

我已经尝试过使用

final Intent intent = new Intent(NfcAdapter.ACTION_TAG_DISCOVERED);
intent.putExtra(NfcAdapter.EXTRA_ID, "1234567890".getBytes());
solo.getCurrentActivity().startActivity(intent);

但这只是给了我一个 ActivityNotFoundException 。目前我检索nfc片段并调用方法从测试内部手动处理意图,但这给了我

  

android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。

因为该方法涉及更新视图和诸如此类的东西。它以某种方式工作,因为我只需要切换到不同的活动或片段然后返回以获取视图更新,但我想知道是否有更好更清洁的方式这样做。

感谢您的帮助,如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

我假设solo.getCurrentActivity()指的是应该接收NFC意图的活动,否则您必须调整活动类和上下文以引用正确的值:

Class activityCls = solo.getCurrentActivity().getClass();
Context packageContext = solo.getCurrentActivity();

然后创建挂起的intent(更好的是,您可以使用传递给enableForegroundDispatch()方法的PendingIntent):

PendingIntent pendingIntent = PendingIntent.getActivity(
    packageContext,
    0,
    new Intent(packageContext, activityCls).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
    0);

设置NFC意图的参数:

String intentAction = NfcAdapter.ACTION_TAG_DISCOVERED;
Tag tag = ...;
byte[] tagId = ...;
NdefMessage ndefMessage = ...;

准备NFC意图:

Intent intent = new Intent();
intent.setAction(intentAction);
intent.putExtra(NfcAdapter.EXTRA_TAG, tag);
intent.putExtra(NfcAdapter.EXTRA_ID, tagId);
if (ndefMessage != null) {
    intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[] { ndefMessage });

    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentAction)) {
        Uri uri = message.getRecords()[0].toUri();
        String mime = message.getRecords()[0].toMimeType();
        if (uri != null) {
            intent.setData(uri);
        } else {
            intent.setType(mime);
        }
    }
}

使用上面的参数化设置发送待处理的意图:

pendingIntent.send(packageContext, Activity.RESULT_OK, intent);