Создание тестового примера junit для интерактора / докладчика в Android (kotlin) с использованием mockito - PullRequest
0 голосов
/ 17 мая 2019

В моем приложении я следую шаблону MVP, в этом я хочу сделать тестовые примеры junit для классов презентатора и модели (интерактора) для проверки бизнес-логики.

Ниже приведен код, который я написал для докладчика.и модель, и я также написал тестовый пример junit, как упомянуто ниже.

LoginPresenterImpl.kt

class LoginPresenterImpl : LoginPresenter, LoginResponseCallback {


lateinit var loginIntegractor:LoginIntegractor
override fun loginSuccess(user: User) {
    loginView.hidProgress()
    loginView.loginSuucces(user)

}

override fun loginFailed(errorMessage: String) {
    loginView.hidProgress()
    loginView.loginFailed(errorMessage)

}

lateinit var loginView:LoginView
constructor(context: Context,loginView: LoginView){
    this.loginView = loginView;
    loginIntegractor = LoginInteractorImpl(context,this);
}
override fun login(userName: String, password: String) {
    loginView.showProgress();
    loginIntegractor.login(userName,password);
}
}

LoginInteractorImpl.kt Thisфайл состоит из бизнес-логики входа в систему

class LoginInteractorImpl : LoginIntegractor {

val  TAG:String = LoginInteractorImpl::class.java.simpleName;
var loginResponseCallback: LoginResponseCallback;
var context: Context? = null;

constructor(context: Context,loginResponseCallback: LoginResponseCallback){
    this.context = context;
    this.loginResponseCallback = loginResponseCallback;
}
constructor(loginResponseCallback: LoginResponseCallback){
    this.loginResponseCallback = loginResponseCallback;
}

override fun login(username: String, password: String) {
    if(username.trim().isBlank()){
        loginResponseCallback.loginFailed("Please enter username");
    }
    else if(password.trim().isBlank()){
        loginResponseCallback.loginFailed("Please enter password");
    }
    else{

        val apiService:ApiService = ApiService.Factory.create();
        val jsonObject = JSONObject();
        jsonObject.put("username",username);
        jsonObject.put("password",password);
        val call:Call<LoginResponse> = apiService.login(jsonObject.toString())
        call.enqueue(object : Callback<LoginResponse> {
            override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
                Log.d(TAG, "login success")
                if (response != null) {
                    val status = response.body()!!.getStatus()
                    if (status == 0) {
                        loginResponseCallback.loginSuccess(response.body()!!.getUser())
                    } else {
                        loginResponseCallback.loginFailed(response.body()!!.getMessage())
                    }
                }
            }

            override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                Log.d(TAG, "login failed")
                loginResponseCallback.loginFailed("Something went wrong while login")
            }
        })
    }

}

}

LoginInteractorTest.kt Это файл тестового примера Juit.

class LoginInteractorTest {

var loginIntegractor:LoginIntegractor? = null
@Mock
private lateinit var callback: LoginResponseCallback
@Captor
private lateinit var argumentCaptor:ArgumentCaptor<LoginResponseCallback>;
@Captor
private lateinit var nameCapcture:ArgumentCaptor<String>;
@Captor
private lateinit var pwdcapcture:ArgumentCaptor<String>;
private lateinit var user: User;
@Before
fun setUp(){
    callback = mock()
    user = mock()
    val captor = argumentCaptor<() -> Unit>()
    nameCapcture = ArgumentCaptor.forClass(String::class.java)
    pwdcapcture = ArgumentCaptor.forClass(String::class.java)
    loginIntegractor = LoginInteractorImpl(callback)
}

@Test
fun testLogin() {
    MockitoAnnotations.initMocks(this)
    loginIntegractor?.login("ashok","narra")
   // verify(loginIntegractor?.login(nameCapcture.capture(),pwdcapcture.capture()))
   // argumentCaptor.value.loginSuccess(ArgumentMatchers.any(User::class.java))
    Mockito.verify(callback).loginSuccess(ArgumentMatchers.any(User::class.java));
}

} ​​

тестовый пример не пройден говоря, что java.lang.IllegalStateException: ArgumentMatchers.any (User :: class.java) не должен быть нулевымв андроиде с помощью kotlin?

1 Ответ

0 голосов
/ 18 мая 2019

У меня недавно была такая же проблема, и, честно говоря, я не смог ее решить, и в итоге я использовал mockito-kotlin.

Вместо

 Mockito.verify(callback).loginSuccess(ArgumentMatchers.any(User::class.java));

Вы можете просто написать:

Mockito.verify(callback).loginSuccess(any())

Где any() происходит от мокито котлин. Обычно нет необходимости указывать тип, но в случае, если вам это нужно, вы всегда можете сделать это как any<User>()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...