任务 <FirebaseVisionText> 未在 Robolectric 的测试中执行
Task<FirebaseVisionText> not executing in tests with Robolectric
我在测试 FirebaseVisionTextRecognizer.processImage()
的结果时遇到问题
我的 Android 应用获取该函数的结果并尝试在特殊上下文中对其进行解释。
不同类型的图像应该使用定制的解析器进行不同的处理。所以我认为对这些 类 进行自动化测试是正确的方法。
Robolectric 听起来像是这个用例的正确框架,但我不太确定。
@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();
}
没有打印任何内容,如果您注释掉表示要等到任务完成的命令,您将永远等待 (>2h)。
我怀疑它与库在第一次使用时必须下载的文件有关,但我不确定它是由 ml-vision 工具包或 Robolectric 框架。
感谢您提供有关如何解决此问题的任何建议或对我不需要的其他设置的建议。
是的,textRecognizer 取决于要通过 Google Play 服务下载的模型。在 robolectric 测试中很难测试涉及模型的管道。您将需要在某种程度上进行模拟,以使您的单元测试能够测试您自己的代码。
我在测试 FirebaseVisionTextRecognizer.processImage()
的结果时遇到问题我的 Android 应用获取该函数的结果并尝试在特殊上下文中对其进行解释。 不同类型的图像应该使用定制的解析器进行不同的处理。所以我认为对这些 类 进行自动化测试是正确的方法。
Robolectric 听起来像是这个用例的正确框架,但我不太确定。
@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();
}
没有打印任何内容,如果您注释掉表示要等到任务完成的命令,您将永远等待 (>2h)。
我怀疑它与库在第一次使用时必须下载的文件有关,但我不确定它是由 ml-vision 工具包或 Robolectric 框架。
感谢您提供有关如何解决此问题的任何建议或对我不需要的其他设置的建议。
是的,textRecognizer 取决于要通过 Google Play 服务下载的模型。在 robolectric 测试中很难测试涉及模型的管道。您将需要在某种程度上进行模拟,以使您的单元测试能够测试您自己的代码。