0

アクティビティとサービスの間の相互作用をどのようにテストできますか?

たとえば、現在の音楽プレーヤーの再生キューを管理するサービスと、再生キューをユーザーに表示するアクティビティがあります。アクティビティが再生キューを正しく表示することをテストしたいと思います。

public class ViewAvailableSongsActivityTests extends ActivityInstrumentationTestCase2<ViewAvailableSongsActivity> {
    public ViewAvailableSongsActivityTests() {
        super(ViewAvailableSongsActivity.class);
    }

    public void testOneAvailableSong() {
        SongParcel song = new SongParcel("Test Title", "Test Artist", "content://testuri");
        addSongToAvailableList(song);

        Activity activity = this.getActivity();
        ListView lstAvailableSongs = (ListView) activity.findViewById(R.id.lstAvailableSongs);
        assertEquals(1, lstAvailableSongs.getCount());

        assertListViewItemIsCorrect(lstAvailableSongs, 0, song);

        stopMyService();
    }

    public void test3AvailableSongs() {
        SongParcel songLast = new SongParcel("Test Title", "Test Artist1", "content://testuri");
        addSongToAvailableList(songLast);

        SongParcel songFirst = new SongParcel("A Good Song", "Test Artist2", "content://testuri");
        addSongToAvailableList(songFirst);

        SongParcel songMiddle = new SongParcel("Bravo", "David", "content://tests");
        addSongToAvailableList(songMiddle);

        Activity activity = this.getActivity();
        ListView lstAvailableSongs = (ListView) activity.findViewById(R.id.lstAvailableSongs);
        assertEquals(3, lstAvailableSongs.getCount());

        assertListViewItemIsCorrect(lstAvailableSongs, 0, songFirst);
        assertListViewItemIsCorrect(lstAvailableSongs, 1, songMiddle);
        assertListViewItemIsCorrect(lstAvailableSongs, 2, songLast);

        stopMyService();
    }

    private void addSongToAvailableList(SongParcel song) {
        Context context = this.getInstrumentation().getTargetContext();
        Intent addSongIntent = new Intent(context, MyService.class);
        addSongIntent.setAction(MyService.ADD_SONG_TO_AVAILABLE_LIST);

        addSongIntent.putExtra(MyService.EXTRA_SONG, song);
        context.startService(addSongIntent);
    }

    private void assertListViewItemIsCorrect(ListView lstView, int index, SongParcel song) {
        Adapter adapter = lstView.getAdapter();
        View row = adapter.getView(0, null, lstView);

        TextView txtTitle = (TextView) row.findViewById(R.id.txtTitle);
        assertEquals(song.getTitle(), txtTitle.getText());

        TextView txtArtist = (TextView) row.findViewById(R.id.txtArtist);
        assertEquals(song.getArtist(), txtArtist.getText());
    }

    private void stopMyService() {
        this.getActivity().stopService(new Intent(this.getInstrumentation().getTargetContext(), MyService.class));
    }
}

を使用してみActivityInstrumentationTestCase2ましたが、サービスの使用に問題がありました。アクティビティは常に 3 曲を表示するため、サービスはテストからテストへと持続しているように見えました。

ActivityInstrumentationTestCase2間違って使用していますか、それとも別のテスト クラスを使用する必要がありますか?

4

1 に答える 1

0

私にはバグがあったことが判明したため、stopService()=P と呼ばれることはありませんでした。でassertListViewItemIsCorrect()adapter.getView(0, null, lstView)されている必要がありますadapter.getView(index, null, lstView)。現在、すべてが正常に機能しているようです。

于 2013-08-15T19:25:07.990 に答える