В моем приложении я следую шаблону 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?