我在我的應用程序中有MVP。主持人有接口Mockito Android單元測試
public interface ILoginPresenter<V> extends Presenter<V> {
void logUserIn(String email, String password, String deviceToken, String deviceType);
}
實現具有RX單
mLoginSubscription = mModel.logUserIn(email, password, deviceToken, deviceType)
.compose(RxUtil.setupNetworkSingle())
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
Timber.i("Log in complete");
}
@Override
public void onError(Throwable e) {
Timber.e(e, "Retrofit could not get User.");
getView().dismissProgressDialog();
}
@Override
public void onNext(UserResponseRetrofit response) {
Timber.i("Retrofit is attempting to get User");
mSaveModel.saveUser(user);
getView().dismissProgressDialog();
getView().goToMenuActivity();
}
});
我也有模塊匕首
@Module
public class ModelModule {
@Provides
@ScreenScope
public ILoginModel provideLoginModel(LoginModel p) {
return p;
}
}
我的單元測試樣子未來:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21, manifest = "/src/main/AndroidManifest.xml")
public class LoginPresenterTest {
public static final String SOME_OTHER_TOKEN = "someOtherToken";
private AppComponent mAppComponent;
private LoginComponent mLoginComponent;
private ILoginView mockView;
private ModelModule mockModel;
private ILoginPresenter mLoginPresenter;
@Before
public void setup() {
// Creating the mocks
mockView = Mockito.mock(ILoginView.class);
mockModel = Mockito.mock(ModelModule.class);
ILoginModel mock = Mockito.mock(ILoginModel.class);
User urr = Mockito.mock(User.class);
Mockito.when(mockModel.provideLoginModel(null)).thenReturn(mock);
Mockito.when(mock.logUserIn("", "", "", "")).thenReturn(ScalarSynchronousSingle.just(urr));
mAppComponent = DaggerAppComponent.builder()
.appModule(new AppModule(RuntimeEnvironment.application))
.build();
mLoginComponent = DaggerLoginComponent.builder()
.appComponent(mAppComponent)
.modelModule(mockModel)
.presenterModule(new PresenterModule())
.build();
mLoginPresenter = mLoginComponent.provideLoginPresenter();
mLoginPresenter.setView(mockView);
}
@Test
public void testLogin() {
mLoginPresenter.logUserIn("", "", "", "");
try {
java.lang.Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Mockito.verify(mockView).dismissProgressDialog();
}
因此,使用匕首我需要正確構建Presenter。爲此,我試圖使用Mockito.when。首先看起來這條線不起作用
Mockito.when(mockModel.provideLoginModel(null)).thenReturn(mock);
目標的目的是用我自己的Model實現返回Single。
真的不明白爲什麼我的ModelModule模擬不起作用?
你是什麼意思不起作用?你的意思是它沒有迴歸你的模擬?你確定匕首正在用參數'null'調用'provideLoginModel'嗎?如果你不關心這個參數,請執行'Mockito.when(mockModel.provideLoginModel(any()))。然後返回(模擬);' – cyroxis
謝謝'any()' - 對於其他幾個問題的答案 –
Great I更新我的答案,以幫助未來的讀者。 – cyroxis