Potrzebuję porady, jak wyśmiewać api odpoczynku. Moja aplikacja jest w architekturze MVP.Test jednostkowy aprobaty Retrofit 2 api z Mockito
Mój interfejs API:
public interface MyAPI {
@GET("{cmd}/{userName}/{password}")
Observable<Response> login(
@Path("cmd") String cmd,
@Path("userName") String userName,
@Path("password") String password
);
Moje usługi:
public class MyService implements IService {
private static MyService mInstance = new MyService();
private MyAPI mApi;
public static MyService getInstance() {
return mInstance;
}
private MyService() {
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectTimeout(Config.DEFAULT_TIMEOUT, TimeUnit.SECONDS);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.kBaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(httpClientBuilder.build())
.build();
this.mApi = retrofit.create(MyAPI.class);
}
public void login(
Subscriber<Response> subscriber,
String userName,
String password) {
mApi.login(Config.kLoginCmd,userName,password)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
Moja klasa prezenter:
public class LoginPresenter implements LoginContract.Presenter {
LoginContract.View mView;
IService mService;
ISession mSession;
public LoginPresenter(LoginContract.View loginView, IService service, ISession session) {
mView = loginView;
mService = service;
mSession = session;
}
@Override
public void login(String email, String password) {
Subscriber<Response> subscriber = new Subscriber<Response>() {
@Override
public void onCompleted() {
mView.showLoading(false);
}
@Override
public void onError(Throwable e) {
mView.showError(e.getLocalizedMessage());
}
@Override
public void onNext(Response response) {
if (response.getResults().getStatus().equalsIgnoreCase(Config.kResultCodeOK)) {
mView.loginSuccess();
} else {
mView.showError(response.getResults().getStatus().getErrmsg());
}
}
};
mView.showLoading(true);
mService.login(
subscriber,
email,
password);
}
Nie ma innego sposobu, aby przetestować prezenter pisząc Mock usługi . Ale nie podoba mi się to tak bardzo i myślę, że Mockito mógłby pomóc.
Oto moja klasa Test:
public class LoginPresenterMockTest {
private LoginPresenter mLoginPresenter;
@Mock
LoginContract.View view;
@Mock
IService service;
@Mock
ISession session;
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
mLoginPresenter = new LoginPresenter(view, service, session);
}
@Test
public void testLoginWithCorrectUserNameAndPassword() throws Exception {
mLoginPresenter.login("[email protected]","password");
verify(view).loginSuccess();
}
}
Co chcę zrobić, to ja mock Loginsuccess połączenia danych odpowiedzi(), gdy odpowiedź jest poprawna.
Oczywiście mój obecny test nie zadziała. Potrzebuję porady, jak to udawać? Dowolny pomysł? Dzięki.
'' 'Mockito.when (service.login (any(), anyString(), anyString()). thenReturn (Observable.just (response)); '' 'Jak określić pierwszy parametr? Jest subskrybentem. Nie mogę go przesłać do żadnego(). Dziękuję –
Przepraszam, nie zauważyłem, że przekazujesz subskrybenta. Myślę, że lepiej jest zmień swoją metodę usługi, która zwraca Observable i zasubskrybuj ją w klasie prezentera. W takim przypadku podany kod zadziała. W przeciwnym razie powinieneś kpić z mApi. –
Napraw problem przez ** ArgumentCaptor ** –