• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    android test
    Last Modify : 08 March, 2019(10:07)
    Mockito & PowerMock * JUnit 위에서 동작하며 Mocking 과 Verification 을 돕는 프레임워크 References * https://github.com/mockito/mockito * https://github.com/mockito/mockito/wiki/Mockito-features-in-Korean * http://wonwoo.ml/index.php/post/1453 * https://softarchitecture.tistory.com/64 * https://medium.com/androiddevelopers/mock-final-and-static-methods-on-android-devices-b383da1363ad PowerMocking * https://bestalign.github.io/2017/05/07/intro-powermock-1/ gradle testImplementation 'org.mockito:mockito-core:2.24.5' testImplementation 'org.powermock:powermock-core:2.0.0-beta.5' testImplementation 'org.powermock:powermock-api-mockito2:2.0.0-beta.5' testImplementation 'org.powermock:powermock-module-junit4:2.0.0-beta.5' testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.0-beta.5' // ---- verify // verify 를 이용해서 mock 객체에 대한 메소드가 특정 조건으로 실행 되었는지 검증 verify(T mock).method() // method 종류 atLeastOnece() : 최소 1번 수행했는지 검증 atLeast(int n) : 적어도 n 번 수행 했는지 검증 times(int n) : 무조건 n 번 수행 했는지 검증 (n 보다 크거나 작으면 오류) atMost(int n) : 최대한 n 번 수행 했는지 검증 never() : 수행 되지 않았는지 검증 (수행했으면 오류) // 테스트 예 ---- List<String> testmock = mock(ArrayList.class); testmock.add("1"); testmock.add("2"); testmock.add("3"); // add 가 최소 1번 호출 되었는지 확인 verify(testmock, atLeastOnce()).add(anyString()); // add 가 최소한 3번 이상 호출되었는지 검증 verify(testmock, atLeast(3)).add(anyString()); // add 가 최대한 3번 이하 호출되었는지 검증 verify(testmock, atMost(3)).add(anyString()); // add 가 3번 호출되었는지 검증 verify(testmock, times(3)).add(anyString()); // add("1") 이 1번 호출되었는지 검증 verify(testmock, time(1)).add("1") // add("2") 이 1번 호출되었는지 검증 verify(testmock, time(1)).add("2") // add("3") 이 1번 호출되었는지 검증 verify(testmock, time(1)).add("3") // add("4") 이 호출되지 않았는지 검증 verify(testmock, never()).add("4") when when() : mock 을 수행하기 위해 원하는 값을 리턴하는 기능 제공 한다. when 메소드는 mock 이 감싸고 있는 메소드가 호출되었을때 mock 객체의 메소드를 호출 선언할 때 사용하며 OngoingStubbing 이라는 인터페이스를 반환한다. OngoingStubbing 메소드 thenAnswer(Answer<?> answer): 으로 원하는 작업을 수행한다. thenCallRealMethod() : 해당 메소드가 구현되어 있다면, 실제 메소드를 호출한다. thenReturn(T value) : 지정한 값을 반환 한다. thenReturn(T value, T... values) : 지정된 값을 순차적으로 반환 한다. thenThrow(Throwable... throwables) : 예외를 야기시키는 Throwable 객체를 지정 한다. 클래스 선언 @RunWith(MockitoJUnitRunnder.class) mock 인스턴스 생성 @Mock private User user; @Mock 또는 @Spy 이 붙은 Mock 객체를 자신의 멤버 클래스가 일치하면 주입한다. (테스트할 객체내에 또 다른 객체를 생성해야 한다면 @Mock 을 이용할 수 있다.) @InjectMocks // 테스트 예 ---- public class AuthService { private AuthDao dao; public boolean isLogin(String id) { if (dao.isLogin) { // TODO return true } return false } } public class AuthDao { public boolean isLogin(String id) { // TODO } } @Mock AuthDao dao @InjectMocks AuthService service @Test public void example() { MockitoAnnotations.initMocks(this); when (dao.isLogin(eq("JDM"))).whenReturn(true); assertTrue(service.isLogin("JDM") == true); assertTrue(service.isLogin("ETC") == false); } @Before, @After 메소드에 선언되면 해당 테스트 클래스 안에서 메소드 들이 테스트 되기 전/후에 초기화를 실행 //--------- https://developer.android.com/training/testing/ https://thdev.tech/androiddev/2016/05/04/Android-Test-Example/ # context 가 필요할 땐 아래와 같이 코딩 private Context mContext; @Before public void setup() throws Exception { // https://stackoverflow.com/questions/8605611/get-context-of-test-project-in-android-junit-test-case mContext = InstrumentationRegistry.getContext(); } # activity 가 필요할 때 아래와 같이 코딩 @Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class); private MainActivity activity; # 테스트시 UI 테스트가 필요한 경우 @UiThreadTest 를 이용해야 함 # 어썰트 처리는 아래와 같이 이용하면 됨 assertThat(object).hasFlags(FLAGS) assertThat(object).doesNotHaveFlags(FLAGS) assertThat(intent).hasData(URI) assertThat(extras).string(string_key).equals(EXPECTED) # static method 의 경우 아래 처럼 spy 처리 하면 됨 spy(${YourClassName}.class); 예) spy(HexUtils.class); 이후 HexUtils.methodName(); 식으로 호출 하면 됨 이런 내용이 사전에 등록해서 사용가능한지 테스트를 해보았고 결론적으로 아래와 같이 사용하면 됨 @Before public void setup() { PowerMockito.mockStatic(TestHelloClass.class); PowerMockito.mockStatic(HexUtils.class); Logger logger = PowerMockito.mock(Logger.class); PowerMockito.mockStatic(LoggerFactory.class); PowerMockito.when(LoggerFactory.getLogger(AESUtils.class)).thenReturn(logger); PowerMockito.mockStatic(AESUtils.class); spy(HexUtils.class); spy(AESUtils.class); }

    Comment


    입력하3 1566417567



    Locations of visitors to this page