使用Robolectric测试ListView

4

我目前正在尝试使用Robolectric测试一些Android代码,但是我的ListView出现了一些问题。当我尝试访问子视图时,由于列表为空,ListView始终返回null。

应用程序的实现如下,并创建了一个简单的列表视图:

private ListView listView;
private ArrayAdapter<String> adapter;
private static String values[] = 
        new String[] {"Android", "Apple", "Windows" };

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_overview);

    initialize();
}

private void initialize() {
    listView = (ListView) findViewById(R.id.tweet_list);

    adapter = new ArrayAdapter<String>(
            getApplicationContext(), 
            android.R.layout.simple_list_item_1, 
            values);

    listView.setAdapter(adapter);
}

然而,当我尝试访问我的ListView时,如下所示。Robolectric TestRunner总是在我通过getChildAt()访问ArrayAdapter时返回null。
private OverviewActivity activity;
private ListView listView;

@Before
public void setUp() throws Exception {
    activity = new OverviewActivity();      
    activity.onCreate(null);

    listView = (ListView) activity.findViewById(R.id.tweet_list);
}

@Test
public void shouldFindListView() throws Exception {     
    if (listView.getChildCount() > 0) {
        assertThat(
                "Android",
                equalTo(listView.getChildAt(0).toString()));
    } else {
        fail("no child views are avaliable");
    }
}

如果这些就是你所有的测试,那我宁愿不要。实际上,你正在测试数组是否有三个元素,并且第一个元素是“Android”。还有一条注释 - “if”条件可以替换为assertEquals(3,listView.getChildCount())。 - Eugen Martynov
你使用的 Robolectric 版本是什么? - Eugen Martynov
我正在使用Robolectric版本0.9.4。我目前正在尝试编写自己的ShadowArrayAdapter,但遇到了很多问题。 - ei.schinken
1
没有在他们的网站上看到评论,说他们现在通过Sonatype分发他们的资源。我正在使用旧版本,它没有提供ArrayAdapters... - ei.schinken
没错,我看了一下源代码 - 一切都已经实现好了。我们这里使用的是Robolectric 1.2。 - Eugen Martynov
你解决了吗? - Jared Burrows
2个回答

6
如果像我这样的人,仍然访问链接以解决如何使用Roboelectric 3.0测试listview的问题。这是我的MainActivityTest文件。
private MainActivity mainActivity;
private ListView lstView;

@Before
public void setup() throws Exception{
    mainActivity= Robolectric.setupActivity(MainActivity.class);
    assertNotNull("Mainactivity not intsantiated",mainActivity);
    lstView=(ListView)mainActivity.findViewById(R.id.list);//getting the list layout xml
    ShadowLog.stream = System.out; //This is for printing log messages in console
}

@Test
public void shouldFindListView()throws Exception{
    assertNotNull("ListView not found ", lstView);
    ShadowListView shadowListView = Shadows.shadowOf(lstView); //we need to shadow the list view

    shadowListView.populateItems();// will populate the adapter
    ShadowLog.d("Checking the first country name in adapter " ,
        ((RowModel)lstView.getAdapter().getItem(0)).getCountry());

    assertTrue("Country Japan doesnt exist", "Japan".equals(((RowModel) lstView.getAdapter().getItem(0)).getCountry()));
    assertTrue(3==lstView.getChildCount());
}

RowModel是用于在列表视图中显示字段的简单POJO。


是的,ShadowListView.populateItems() 是关键。谢谢! - Giorgos Kylafas

0

我看到你正在使用旧版本的Robolectric。我们在使用Robolectric 1.1时,没有遇到与你类似的代码问题。

因此,请将以下行添加到您的pom文件中:

<dependency>
        <groupId>com.pivotallabs</groupId>
        <artifactId>robolectric</artifactId>
        <version>1.1</version>
        <scope>test</scope>
    </dependency>

或者你可以从这里下载并将其捆绑到你的IDE项目中 http://mvnrepository.com/artifact/com.pivotallabs/robolectric/1.1


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