2013-05-01 94 views
6

如何获得Robolectric中ActiveAndroid的ContentProvider的测试覆盖率?这个简单的测试失败。使用Robolectric测试ActiveAndroid

模型:

@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。

所以,我很疑惑为什么cacheInfo中的tableInfo没有初始化。正常的应用程序执行正常。

+0

你在用什么IDE?关于eclipse的解决方法有一个开放的bug,但不是intellij。 https://github.com/pardom/ActiveAndroid/issues/63 – Joe 2013-05-16 21:26:19

+0

它适用于Eclipse。我想'mvn测试'。 – 2013-05-18 13:58:37

+1

是的,它会有相同的问题,因为maven构建到ActiveAndroid期望的文件夹之外。不应该太难改变ActiveAndroid,让你注册你的模型,而不是自动找到它们。 – Joe 2013-05-19 03:13:02

回答

4

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

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

Maven编译成目标/类。对ModelInfo中扫描路径中的“类”进行额外的检查就可以实现。

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