Как смоделировать тег NFC для инструмента разработчика в приложении?

Я пытаюсь смоделировать тег NFC с помощью инструмента для разработки приложений в приложении. Текущая реализация использует отражение и нацелена на API 27. Миграция на API 28 с AndroidX, метод createMockTag не найден. Я замечаю, что это public static в коде Android, но помечены @HideЭто означает, что я не могу получить к нему доступ. Однако я нашел способ создать метку из посылки, но я нигде не нашел простого способа сделать это. Я могу создать свой собственный класс Parcelable, но при вызове in.readInArray(...) в конструкторе он запрашивает параметр, которого у меня нет. Я приложу то, на что это похоже, знаю, и как я хотел бы, чтобы это выглядело.

Это большая проблема, потому что нам нужно высмеивать теги NFC, но, похоже, нет способа получить доступ к методу. И я также пытался скопировать Tag.java класс в моем проекте, но он не может получить доступ к некоторым, казалось бы, внутренним классам, таким как INfcTag и перечисления в TagTechnology, Кто-нибудь еще сталкивался с этим и может, пожалуйста, помочь мне? Спасибо.

// Tag mockTag = Tag.CREATOR.createFromParcel(); // I'd like to create one here
Method createMockTag = Tag.class.getMethod("createMockTag", byte[].class, int[].class, Bundle[].class);     
scanIntent.putExtra(NfcAdapter.EXTRA_TAG, (Tag) createMockTag.invoke(Tag.class, tagId, new int[]{}, new Bundle[]{}));

Вот ссылки, которые я посмотрел:

1 ответ

Вы не хотите копировать код из оригинала, это не то, как работает насмешка. Если этот конкретный метод был помечен как @Hide, это скорее всего означает, что его не рекомендуется использовать. Это, вероятно, означает, что есть альтернатива этому методу в API 28+. @Hide, скорее всего, является результатом того, что они еще не могут полностью отказаться от него, но, скорее всего, в будущем. Вот текущая ссылка - https://developer.android.com/reference/android/nfc/package-summary. В общем, скажем, вы используете Mockito - https://static.javadoc.io/org.mockito/mockito-core/2.25.1/org/mockito/Mockito.html - просто заглушите макет. Похоже, что для создания статических методов существует несколько потоков - для фактического запроса функции: https://github.com/mockito/mockito/issues/1013 и обходного пути: Mocking статических методов с помощью Mockito не уверен, насколько уместен Обходной путь больше (его несколько стар).

Другие вопросы по тегам