Я добавляю инструментальное тестирование в приложение.Я хочу проверить взаимодействие вокруг распознавания речи:
- пользователь нажимает кнопку (
R.id.buttonVoice
), отображая DialogFragment
для распознавания речи - удары
SpeechRecognizer
-in, при прослушивании пользовательского ввода - частичные результаты отображаются в диалоговом окне (пока это не проверяется)
- после завершения диалоговое окно закрывается, и распознанная речь отображается в активности
TextView
(R.id.results
)
Тестирование инструментов с помощью Espresso-Intents звучит как хороший способ убедиться, что мой тест не основан на SpeechRecognizer
. * 1021 системы.*
Вот мой тест, который воспроизводит то же взаимодействие с intended()
заданным намерением :
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityWithPermissionTest {
@Rule
public IntentsTestRule intentsTestRule = new IntentsTestRule<>(MainActivity.class);
@Test
public void clickInput_sendsSpeakIntentAndDisplaysResults() {
// stub intent returning recognition results
intending(hasAction(equalTo(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)))
.respondWith(new ActivityResult(Activity.RESULT_OK, new Intent().putExtra(
SpeechRecognizer.RESULTS_RECOGNITION, new String[]{"I am uttering."})));
// when clicking on the buttonVoice, thus opening the dialog and starting the speechRecognizer
onView(withId(R.id.buttonVoice))
.perform(click());
// expect the recognition results to be displayed
onView(withId(R.id.results))
.check(matches(withText("I am uttering.")));
}
}
Однако этот тест завершается ошибкой 'with text: is "I am uttering."' doesn't match the selected view.
Действительно, когда я смотрю на инструментарий, происходящий на устройстве, я вижу, что real SpeechRecognizer
запускается (и не работает, поскольку он работает на эмуляторе).Таким образом, кажется, что моя цель заглушки не работает.
Почему я не могу заглушить RecognizerIntent
?Есть ли другой способ протестировать взаимодействие с SpeechRecognizer
, не полагаясь на реальное распознавание речи?