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にアクセスしようとすると。getChildAt()を介してArrayAdapterにアクセスしている場合、RobolectricTestRunnerは常に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");
    }
}
4

2 に答える 2

6

私のような人は、まだリンクにアクセスして、Roboelectric 3.0 でリストビューをテストする方法を解決してください。これは私の 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 です。

于 2015-08-06T02:39:10.913 に答える
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

于 2012-12-01T09:33:05.520 に答える