準備技術:
昨天實做一個Login的Navigator頁面切換,今天探討的是伴隨的測試機制。
下圖顯示昨天實做的類別圖,從MVP的模式可知道P控制了整個View的變化,也連接資料。
我們設立test資料夾,要來撰寫測試程式,採用的是JUnit,還要借用Mockito(參考資料4)。
LoginView的測試程式,@Before和@Test是JUnit的測試Anonation,表示接下來要測試的程式,@Before可以當成準備,@Test是測試本體,在測試的原理中,要mock某程式達到完整測試,mock有點類似完全模仿,因為有些測試程式無法完全模仿出來預計結果。
public class LoginViewImplTest {
private LoginView view;
private LoginViewHandler handler;
@Before
public void setUp() {
view = new LoginViewImpl();
handler = mock(LoginViewHandler.class);
view.setHandler(handler);
view.init();
}
@Test
public void isTagAddedAfterButtonIsClicked() {
view.getBtnLogin().click();
verify(handler, times(1)).login();
}
}
接下來顯示P的測試,
public class LoginPresenterTest {
private LoginView view;
private UserService service;
private LoginPresenter presenter;
@Before
public void setUp() throws Exception {
view = mock(LoginView.class);
service = mock(UserService.class);
presenter = new LoginPresenter(view, service);
}
@Test
public void isLoginWorking() throws Exception {
when(view.getTxtUsername()).thenReturn(new TextField("Jimmy"));
when(view.getTxtPassword()).thenReturn(new TextField("Jimmy123"));
presenter.login();
Mockito.verify(service, times(1)).login(anyString(), anyString());
Mockito.verify(view, times(1)).afterSuccessfulLogin();
}
}
測試的程式原理,請多看JUnit in Action,多寫測試多好處,知道程式跑什麼。
參考資料
Day16 結束