ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Mockito Plugin 세팅 - MockMaker
    Mobile Engineering 2020. 4. 19. 16:07

    TDD를 해야 한다는 것은 굳이 설명할 필요가 없을 정도로 잘 알고 계시리라 생각합니다. 그중에서 DI 환경에서 테스트 코드를 작성할때 사용하는 Mock은 필수라고 할 수 있습니다. 그중에서 Mockito와 PowerMock을 많이 사용합니다. 개인적으로 테스트 코드를 작성할때 Mock 라이브러리는 심플하고 쉽게 사용할 수 있는 것을 선호해서 Mockito를 사용합니다. 안드로이드에서 Mockito를 이용해서 유닛 테스트 코드를 만들때 사전에 해줘야 하는 세팅을 알려드리고자 합니다. Mockito를 사용하는 분이라면 한번 맞닥뜨렸을 오류..

     

    Could not initialize plugin: interface org.mockito.plugins.MockMaker 

     

    아래의 그림처럼 잘 나가다가 갑자기 오류가 나면서 테스트 코드가 실패합니다.

    뭐가 잘못된 걸까?

    에러의 내용은 아래와 같습니다. 내용인 즉슨, 'MockMaker 플러그인을 초기화할 수 없습니다.' Mockito를 사용하기 위해서 뭔가를 해줘야 하는 모양입니다.

    java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
    
    	at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:74)
    	at com.sun.proxy.$Proxy8.isTypeMockable(Unknown Source)
    	at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)
    	at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)
    	at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:241)
    	at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.java:229)
    	at org.mockito.internal.MockitoCore.mock(MockitoCore.java:62)
    	at org.mockito.Mockito.mock(Mockito.java:1908)
    	at org.mockito.Mockito.mock(Mockito.java:1817)

    그래서 구글을 검색해서 찾아보니 ClassPath에 MockMaker Interface가 사용할 구현체를 특정 경로에 지정해줘야 한다고 합니다.

     

    https://site.mockito.org/javadoc/current/index.html?org/mockito/plugins/MockMaker.html

     

    Mockito 2.2.7 API

     

    site.mockito.org

     

    그래서 MockMaker를 사용하기 위해서 프로젝트의 아래의 경로에 'org.mockito.plugins.MockMaker'라는 이름으로 파일을 생성합니다.

    org.mockito.plugins.MockMaker 파일 생성하기

     

    'org.mockito.plugins.MockMaker'안에 아래와 같은 문자열을 작성합니다. 만약에 MockMaker 구현체를 별도로 만들어서 사용한다면 구현체의 패키지와 클래스명을 기재하면 됩니다.

    mock-maker-inline

     

    파일을 생성하고 테스트 코드를 동작시키면 아래와 같이 깔끔하게 성공! 참 쉽죠? 

    테스트 성공!

    이렇게 특정 인터페이스를 사용함에 있어서 ClassPath에 파일을 만들고 구현체를 getClass()로 읽어들이는 방법의 아키텍처가 특이해서 인상이 깊었습니다. 

     

    Thanks

    Hans

Designed by Tistory.