使用Robolectric测试ActiveAndroid

6

我该如何在Robolectric上对ActiveAndroid的ContentProvider进行测试覆盖率?这个简单的测试失败了。

模型:

@Table(name = "Things")
    public class Thing extends Model {
    public Thing() {
        super();
    }
}

测试:

@RunWith(RobolectricTestRunner.class)
public class ContentProviderTest {

  @Test
  public void itShouldQuery() throws Exception {
    new Thing().save();
    ContentResolver cr = new MainActivity().getContentResolver();
    assertNotNull(
        cr.query(Uri.parse("content://org.example/things"), 
                   null, null, null, null));
  }
}

导致问题的堆栈跟踪:

java.lang.NullPointerException: null
    at com.activeandroid.Cache.getTableInfo(Unknown Source)
    at com.activeandroid.Model.<init>(Unknown Source)
    at org.example.Thing.<init>(Thing.java:9)
    at org.example.ProviderTest.itShouldQuery(ProviderTest.java:25)

应用程序上下文应该没问题。默认情况下,Robolectric会创建出现在清单中的应用程序,这种情况下是com.activeandroid.Application。
因此,我很困惑为什么缓存中的tableInfo没有初始化。正常的应用程序执行可以正常工作。

你在使用什么IDE?有一个有关Eclipse的解决方法的开放性错误报告,但是没有针对Intellij的。https://github.com/pardom/ActiveAndroid/issues/63 - Joe
它可以在Eclipse中工作。我想要执行“mvn test”。 - Fred Medlin
1
是的,这会有相同的问题,因为Maven构建到一个文件夹中,而不是ActiveAndroid所期望的文件夹。将ActiveAndroid更改为允许您注册模型而不是自动查找它们应该不难。 - Joe
好主意。我会尝试一下,看看效果如何。 - Fred Medlin
1个回答

4

要在Maven单元测试期间自动扫描ActiveAndroid模型,需要对ModelInfo.scanForModel进行简单的更改。

在该方法中,有一个“Robolectric fallback”,它检测和扫描包含“bin”的路径。这处理Eclipse项目中的模型类。

Maven编译到target/classes。在ModelInfo中扫描路径时,添加一个额外的检查以获取“classes”即可。

很快会为此添加ActiveAndroid拉取请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接