1. 程式人生 > >二.Android單元測試 Mockito的更多用法

二.Android單元測試 Mockito的更多用法

 相對於上篇文章,這篇介紹了更多mockito的用法,對照著MeetingPresenterImp.java和MeetingPresenterImpTest.java大家可以看看Android單元測試用例怎麼寫.

public class MeetingPresenterImp implements MeetingContract.MeetingPresenter {

    private MeetingController meetingController;

    private MeetingAudioManager audioManager;

    private MeetingContract.MeetingView meetingView;

    private
MeetingParticipant localParticipant; public MeetingPresenterImp(MeetingContract.MeetingView meetingView, MeetingController meetingController, MeetingAudioManager audioManager) { this.meetingController = meetingController; this.audioManager = audioManager; this.meetingView = meetingView; } //開關攝像頭
@Override public void toggleCamera() { meetingController.toggleCamera(); } //開關揚聲器 @Override public void toggleSpeaker() { if (audioManager.isSpeakerOn()) { audioManager.turnOffSpeaker(); } else { audioManager.turnOnSpeaker(); } } //設定Orientation
public void setOrientation(int orientation) { meetingController.setOrientation(orientation); } //更新MainView的可見度 public void updateMainViewVisibility(boolean isShowAllButtons) { meetingView.updateButtonsVisibility(isShowAllButtons); meetingView.updateSelfSurfaceVisibility(isShowAllButtons); meetingView.updateSelfIconVisibility(isShowAllButtons); } //更新會議時間 public void updateMeetingTime(long time) { Date d = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); meetingView.updateTime(sdf.format(d)); } //觀看某位與會人的視訊源 synchronized void startWatchVideoSource(MeetingParticipant participant, long mainSourcePtr, long minSourcePtr) { if (participant == null || participant.isBeingWatched()) { return; } if (participant.equals(localParticipant)) { meetingController.setSelfPreviewView(mainSourcePtr, minSourcePtr); } else { meetingController.startWatchVideoSource(participant.getUri(), mainSourcePtr, 0, 960, 720, 20, 0); } participant.setBeingWatched(true); } }
@RunWith(MockitoJUnitRunner.class)
public class MeetingPresenterImpTest {

    @Mock
    MeetingContract.MeetingView meetingView;

    @Mock
    MeetingController meetingController;

    @Mock
    MeetingAudioManager meetingAudioManager;

    MeetingPresenterImp meetingPresenterImp;

    private Random random = new Random();

    @Before
    public void setUp() throws Exception {
        meetingPresenterImp = new MeetingPresenterImp(meetingView, meetingController, meetingAudioManager);
    }

    //簡單的驗證方法是否執行
    @Test
    public void toggleCamera() throws Exception {
        meetingPresenterImp.toggleCamera();

        Mockito.verify(meetingController).toggleCamera();
    }

    //使用when().thenReturn控制mock物件的方法的返回值
    @Test
    public void should_turn_off_speaker() throws Exception {
        Mockito.when(meetingAudioManager.isSpeakerOn()).thenReturn(true);

        meetingPresenterImp.toggleSpeaker();

        Mockito.verify(meetingAudioManager).turnOffSpeaker();
    }

    //同上,但是測試的是另外一個分支,這裡isSpeakerOn()返回false
    @Test
    public void should_turn_on_speaker() throws Exception {
        Mockito.when(meetingAudioManager.isSpeakerOn()).thenReturn(false);

        meetingPresenterImp.toggleSpeaker();

        Mockito.verify(meetingAudioManager).turnOnSpeaker();
    }

    //測試方法執行還不夠,測試傳入的引數是否一致
    @Test
    public void should_set_orientation() throws Exception {
        meetingPresenterImp.setOrientation(0);
        verify(meetingController).setOrientation(0);
    }

    //使用inOrder()測試方法是否按特定順序執行
    @Test
    public void should_update_main_view_visibility() throws Exception {
        boolean isShowAllButtons = random.nextBoolean();

        meetingPresenterImp.updateMainViewVisibility(isShowAllButtons);
        InOrder inOrder = inOrder(meetingView);
        inOrder.verify(meetingView).updateButtonsVisibility(isShowAllButtons);
        inOrder.verify(meetingView).updateSelfSurfaceVisibility(isShowAllButtons);
        inOrder.verify(meetingView).updateSelfIconVisibility(isShowAllButtons);
    }

    //測試一個String被format後的值是否和想要的一致,情況一
    @Test
    public void should_update_meeting_time_30_seconds() throws Exception {
        meetingPresenterImp.updateMeetingTime(30 * 1000);
        verify(meetingView).updateTime("00:00:30");
    }

    //測試一個String被format後的值是否和想要的一致,情況二
    @Test
    public void should_update_meeting_time_61_seconds() throws Exception {
        meetingPresenterImp.updateMeetingTime(61 * 1000);
        verify(meetingView).updateTime("00:01:01");
    }

    //使用never測試一個方法一次都沒有被執行
    @Test
    public void should_start_watch_video_source_when_participant_is_null() throws Exception {
        meetingPresenterImp.startWatchVideoSource(null, 0, 0);

        verify(meetingController, never()).setSelfPreviewView(anyLong(), anyLong());
        verify(meetingController, never()).startWatchVideoSource(anyString(), anyLong(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt());
    }

}