AndroidAnnotations 과 테스트

토스랩(Toss Lab)

이 포스팅은 총 4부로 이어지며 현재는 4부입니다.

  1. 1부 : Android, MVC, MVVM, MVP
  2. 2부 : Android 와 Annotation
  3. 3부 : AndroidAnnotations 과 MVC
  4. 4부 : AndroidAnnotations 과 테스트


앞선 3개의 포스팅을 통해 AndroidAnnotations 과 MVC 가 view 에 관여하는 동작들이 모두 View 로 분리된 것을 확인할 수 있습니다.

이러한 구조덕분에 Model 에 대한 테스트와 View 에 대한 테스트가 명확히 구분지어지게 되었습니다.

Test 코드를 작성함에 있어서 View 에 대한 테스트가 다소 어려움이 있다는 것을 감안한다면 Model 에 대한 테스트만 집중할 수 있는 구조가 테스트에 대한 접근을 더욱 쉽게 해줍니다.

다음은 앞선 포스팅에서 정의된 코드 중에서 Model 에 대한 테스트입니다.

※ 테스트코드는 Robolectric 을 이용하여 작성하도록 하겠습니다.


Model Test

@RunWith(RobolectricGradleTestRunner.class)
public class MainModelTest {

private MainModel mainModel;

@Setup
public void init() {
mainModel = new MainModel(Robolectric.application);
}

@Test
public void testGetReleaseState() {
// given
String version = "3.19" // not yet released
// when
boolean isReleased = mainModel.getReleaseState(version);

// then
assertThat(isReleased, is(equalTo(false));

// given
version = "3.18" // released

// when
isReleased = mainModel.getReleaseState(version);

// then
assertThat(isReleased, is(equalTo(true));

}

}

위와 같이 Model 만 별도로 테스트가 용이해졌습니다.


Presenter Test

Presenter 에 대한 테스트는 Model 에 대한 테스트와 다릅니다.

Activity 에 커플링이 높기 때문에 해당 Activity 를 직접 바인딩해야 합니다.

@RunWith(RobolectricGradleTestRunner.class)
public class MainViewTest {

private MainActivity mainActivity;
private MainView MainView;

@Setup
public void init() {
mainActivity = Robolectric.buildActivity(MainActivity.class).create().start().resume().get();

MainView  = mainActivity.mainView;
}

@Test
public void testGetVersionText() {
// given
String version = "3.19"

// when
MainView.versionEditText.setText(version);

// then
assertThat(MainView.getVersionText(), is(equalTo(version));

}

}

Jandi Team은 View 를 테스트하기 위해서 Presenter 와 Activity 의 패키지 Level 을 같은 Level 로 유지하고 있습니다.

AndroidAnnotations 에서 DI 를 설정하기 위해서는 해당 변수나 메소드는 최소 Package Scope 로 정의해야하기에 위와 같은 형태의 Field 접근을 볼 수 있습니다.


정리

AndroidAnnotations 를 활용한 MVC 패턴의 전환의 또다른 이점은 이와 같이 테스트를 명확히 분리할 수 있다는 장점을 주었습니다. 물론 이 방법은 MVVM, MVP 로 구현하였을때보다 나은 형태라 할 수는 없으나 View 에 대한 테스트가 좀 더 용이해진 것이라 생각합니다.

※ Activity 는 왜 테스트하지 않나요?

MVP 패턴에서 Activity는 Controller 의 모습을 지니고 있습니다. 이는 Unit Test 가 아닌 Behavior 테스트에 가까운 모습이며 다른 방식으로의 테스트코드 구현이 필요하다고 생각합니다.


#토스랩 #잔디 #JANDI #개발 #개발자 #개발팀 #기술스택 #일지 #후기 #꿀팁 #인사이트

기업문화 엿볼 때, 더팀스

로그인

/