2016-06-23 5 views
2

を起動していないが、私は次のようなエラーになっています行き方:Androidのテスト - Robolectric + Mockito +レトロフィットはたかったが、私のAndroidアプリで私のレトロフィット呼び出しをテストするためにRobolectricとMockitoを使用しようとするとエラー

Wanted but not invoked: mockApi.register( , ); -> at ServiceTest.testAPI(ServiceTest.java:58) Actually, there were zero interactions with this mock.

改造APIを次のように呼び出しがインタフェースで定義されて次のように

@FormUrlEncoded 
@POST("/register") 
void register(
     @FieldMap Map<String, String> registrationParams, 
     Callback<JsonObject> response) ; 

私のテストクラスは次のとおりです。

@Config(constants = BuildConfig.class) 
@RunWith(TestRunner.class) 
public class SharedServiceTest { 

private RegistrationActivity activity; 
@Mock 
private SharedService mockApi; 

@Captor 
private ArgumentCaptor<Callback<JsonObject>> cb; 


@Before 
public void setUp() { 

    MockitoAnnotations.initMocks(this); 
    ActivityController<RegistrationActivity> controller = Robolectric.buildActivity(RegistrationActivity.class); 
    activity = controller.get(); 

    controller.create(); 
} 

@Test 
public void testAPI() throws Exception { 

    activity.populateFields(); 
    activity.validateFields(); 
    activity.register(""); 

    Mockito.verify(mockApi).register(Mockito.anyMap(), cb.capture()); 

    JsonObject jsonObject = new JsonObject(); 
    jsonObject.addProperty("sessionToken", Mockito.anyString()); 
    jsonObject.addProperty("userId", Mockito.anyString()); 

    cb.getValue().success(jsonObject, null); 

    Assert.assertTrue(ShadowToast.getTextOfLatestToast().contains("Registration completed")); 

} 

} 
public class TestMyApplication extends MyApplication 
     implements TestLifecycleApplication { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override public void beforeTest(Method method) { 
    } 

    @Override public void prepareTest(Object test) { 
    } 

    @Override public void afterTest(Method method) { 
    } 

    @Override public CPSharedService getCPSharedService() { 
     return Mockito.mock(SharedService.class); 
    } 
} 

public void register(){ 

     MyApplication.getInstance().getSharedService().register(mRegistrationParams, new Callback<JsonObject>() { 
      @Override 
      public void success(JsonObject jsonObject, retrofit.client.Response response) { 
       Toast.makeText(RegistrationActivity.this, "Registration completed", Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(RegistrationActivity.this, RetrofitUtils.getErrorMessage(error), Toast.LENGTH_LONG).show(); 
      } 
     }); 

    } 

本当のレトロフィットサービスは、私が使用するrobolectricのための私のテストフォルダに嘲笑している私自身のアプリケーションのクラスから来て次のようにAPIを使用して、私のRegistrationActivityにおける方法があります

私はこのエラーを持っているので、他の質問を検索しましたが、私がここでやろうとしているものと一致しないか、私の問題に解決策を提供していないので、

答えて

2

TestMyApplicationSharedServiceの模擬インスタンスは、テストクラスを宣言したインスタンスと同じではありません。 mockApiフィールドで参照されるインスタンスが実際に呼び出されないため、Mockito.verify(mockApi).register(Mockito.anyMap(), cb.capture());が失敗しています。

@Override public CPSharedService getCPSharedService() { 
     return Mockito.mock(SharedService.class); //this creates a new "mocked" instance 
    } 

あなたのシナリオでは、私には100%明確ではないですが、あなたは、あなたのテストはのインスタンスを設定してみましょうことができればそれがよいでしょう: もう一つの問題は、TestMyApplicationでゲッターは常に各invokationのための新たなモックを返すということですあなたのTestMyApplicationインスタンス内mockApiフィールド:

public class TestMyApplication extends MyApplication 
     implements TestLifecycleApplication { 

    private SharedService sharedService; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override public void beforeTest(Method method) { 
    } 

    @Override public void prepareTest(Object test) { 
    } 

    @Override public void afterTest(Method method) { 
    } 

    @Override public CPSharedService getCPSharedService() { 
     return this.sharedService; 
    } 

    public void setCPSharedService(SharedService sharedService) { 
     // store your mock 
     this.sharedService = sharedService; 
    } 
} 

とテストクラスで:

@Test 
public void testAPI() throws Exception { 

    // configure you TestMyApplication 
    assertTrue(MyApplication.getInstance() instanceof TestMyApplication); 
    TestMyApplication testMyApp = (TestMyApplication) MyApplication.getInstance(); 
    testMyApp.setCPSharedService(this.mockApi); 

    activity.populateFields(); 
    activity.validateFields(); 
    activity.register(""); 

    Mockito.verify(this.mockApi).register(Mockito.anyMap(), cb.capture()); 

    ... 

} 
関連する問題