2015년 03월 01일 | Steve.Jung

AndroidAnnotations 과 테스트

이 포스팅은 총 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 테스트에 가까운 모습이며 다른 방식으로의 테스트코드 구현이 필요하다고 생각합니다.