【问题标题】:Mockito Null Pointer ExceptionMockito 空指针异常
【发布时间】:2018-01-17 01:37:07
【问题描述】:

我正在为我的适配器类编写 Mockito。以下是我的适配器代码

 static class SongAdapterPresenter implements SortedSongSelectionContract.SongAdapterContract.Presenter {

        private List<Song> songs;
        private final Presenter sortedSongSelectionPresenter;
        private final SortedSongSelectionContract.SongAdapterContract.Adapter adapter;
        private SortedSongSelectionContract.SongAdapterContract.SongView selectedSongView;
        private Song selectedSong;

        SongAdapterPresenter(SortedSongSelectionContract.SongAdapterContract.Adapter adapter, SortedSongSelectionContract.Presenter sortedSongSelectionPresenter) {
            this.adapter = adapter;
            this.sortedSongSelectionPresenter = sortedSongSelectionPresenter;
        }

        @Override
        public int getItemCount() {
            return songs != null ? songs.size() : 0;
        }

        @Override
        public void onBindView(SortedSongSelectionContract.SongAdapterContract.SongView songView, int position) {
            Song song = songs.get(position);

            songView.setTitle(song.getName());
            songView.setArtists(song.getArtists());

            List<Genre> genres = song.getGenres();
            int size = genres.size();
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < size; i++) {
                builder.append(genres.get(i).getName()).append(",");
            }
            int length = builder.length();
            if (length > 0) {
                builder.deleteCharAt(length - 1);
            }
            songView.setGenres(builder.toString());
            songView.showPlayIcon(true);

            boolean select = isSongEqual(song);
            if (select) {
                selectedSongView = songView;
            }

            songView.showSelectionUi(select);
        }

        @Override
        public void onItemClicked(SortedSongSelectionContract.SongAdapterContract.SongView songView, int position) {
            Song song = songs.get(position);

            if (isSongEqual(song)) {
               return;
            }

            deSelect(song);

            selectedSongView = songView;
            selectedSongView.showSelectionUi(true);
            selectedSong = songs.get(position);
            sortedSongSelectionPresenter.getBus().post(new BusEvents.SongSelected(selectedSong));
        }

        @Override
        public void setSongs(List<Song> songs) {
            this.songs = songs;
            adapter.refresh();
        }

        @Override
        public void deSelect(Song song) {
            if (!isSongEqual(song)) {
                if (selectedSongView != null) {
                    selectedSongView.showSelectionUi(false);
                }
                selectedSong = null;
                selectedSongView = null;
            }
        }

        private boolean isSongEqual(Song song) {
            return !(song == null || selectedSong == null) && (song == selectedSong || selectedSong.getId().equals(song.getId()));
        }
    }
    //endregion

    //region Instance methods
    private void processEvent(Object event) {
        if (event instanceof BusEvents.SongSelected) {
            deSelect(((BusEvents.SongSelected) event).getSong());
        }
    }
    //endregion
}

我正在尝试为 Adapter 类的 deSelect 方法编写 Mockito 测试

@RunWith(PowerMockRunner.class)
@PrepareForTest(Log.class)
public class SongAdapterPresenterTest {

    private SortedSongSelectionPresenter.SongAdapterPresenter songAdapterPresenter;

    @Mock
    private SortedSongSelectionContract.SongAdapterContract.Adapter adapter;

    @Mock
    private SortedSongSelectionContract.Presenter presenter;

    @Mock
    private SortedSongSelectionContract.SongAdapterContract.SongView songView;


    private Song song;
    private List<Song> songList;

    @Before
    public void setUp() {
        song = new Song("1", "A", "B");
        songList = new ArrayList<>(1);
        songList.add(song);
        songAdapterPresenter = new SortedSongSelectionPresenter.SongAdapterPresenter(adapter, presenter);
    }


    @Test
    public void getItemCountWithSongListNotNull_returnSongListSize() {
        songAdapterPresenter.setSongs(songList);
        Assert.assertEquals(songList.size(), songAdapterPresenter.getItemCount());
    }

    @Test
    public void getItemCountWithSongListNull_returnIsZero(){
        songAdapterPresenter.setSongs(null);
        Assert.assertEquals(0, songAdapterPresenter.getItemCount());
    }


    @Test
    public void deSelect_SongRemoved(){
        songAdapterPresenter.deSelect(song);
        verify(songView).showSelectionUi(false);

    }

} 

我已经创建了我的 View 类的 AdapterPresenter 对象和 Mock 对象,但是当我执行 deSelect 方法时,我不断收到空指针异常。该方法的第一行给出错误。任何帮助将不胜感激。

【问题讨论】:

  • 向我们展示您的尝试。并粘贴您的日志消息。谢谢
  • 我猜selectedSong这个变量是null。你需要在调用deSelect之前执行一个项目点击
  • @ThomasMary 我已经粘贴了我尝试过的内容,并且在日志中我得到空指针异常

标签: android mockito


【解决方案1】:

您应该为 Mock 对象创建自己的行为,因为默认情况下它们返回 null。例如:

when(presenter.someMethod(anyString()).thenReturn(false); 

如果你需要调用真实方法的Test对象使用Spy,或者使用你可以这样操作

when(presenter.someMethod(anyString()).thenCallRealMethod();

这称为部分 Mock。所以当你调用 Presenter.someMethod("any") 时,会调用 Presenter 类的真实方法。

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2019-05-24
    • 2021-06-15
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多