Задача <FirebaseVisionText>не выполняется в тестах с Robolectric - PullRequest
0 голосов
/ 28 марта 2020

У меня проблемы с тестированием результата FirebaseVisionTextRecognizer.processImage ()

Мое Android приложение берет результат этой функции и пытается интерпретировать его в специальном контексте. Различные типы изображений должны обрабатываться по-разному с помощью специального анализатора. Поэтому я подумал, что автоматический тест этих классов будет правильным подходом.

Robolectri c звучит как подходящая структура для этого варианта использования, но я не совсем уверен.

    @Rule
    public TestRule rule = new InstantTaskExecutorRule();

    private static int number = 0;

    @Test
    public void testTask() {

        Bitmap testBitmap = BitmapFactory.decodeFile( "src/test/testImages/img1.jpg" );

        FirebaseApp.initializeApp( ApplicationProvider.getApplicationContext() );

        FirebaseVisionImage visionImage = FirebaseVisionImage.fromBitmap( testBitmap );
        FirebaseVisionTextRecognizer detector = 
                FirebaseVision.getInstance().getCloudTextRecognizer();
        Task<FirebaseVisionText> result =
                detector.processImage( visionImage )
                        .addOnSuccessListener( visionText -> {
                            number = 1;
                            System.out.println( "Success!" );
                        } )
                        .addOnFailureListener(
                                e -> {
                                    number = 2;
                                    System.err.println( "Failed…" );
                                }
                        );

        // nothing of this block works
        ShadowApplication.runBackgroundTasks();
        shadowOf( getMainLooper() ).idle();
        shadowOf( getMainLooper() ).runToEndOfTasks();
        Robolectric.flushBackgroundThreadScheduler();
        Thread t = new Thread( () -> {
            try {
                // Comment this out to see that it runs forever
                // Tasks.await( result );
            } catch( Exception e ) {
                e.printStackTrace();
            }
        } );
        t.start();
        try {
            t.join();
        } catch( InterruptedException e ) {
            e.printStackTrace();
        }


        assertThat( number == 1 ).isTrue();
    }

Ничего не печатается, и если вы закомментируете команду, которая говорит, что вы хотите дождаться завершения задачи, вы будете ждать вечно (> 2 часа).

Я подозреваю, что она имеет что-то связанное с файлами, которые библиотека должна загружать при первом использовании, но я не уверен, вызвано ли это чем-то из набора ml-vision или в среде Robolectri c.

Спасибо за любые советы о том, как решить эту проблему или за предложения для других установок, где мне это не нужно.

1 Ответ

0 голосов
/ 24 апреля 2020

Да, textRecognizer зависит от модели, загружаемой через Сервисы Google Play. Будет сложно протестировать конвейер с моделью в тесте robolectri c. Вам нужно будет издеваться на каком-то уровне, чтобы заставить ваш модульный тест работать для проверки собственного кода.

...