【发布时间】:2017-03-13 15:43:38
【问题描述】:
所以,我只是在编写简单的测试。 问题是测试运行器运行真正的“存储库”类代码而不是模拟代码...... 你知道为什么我会得到一个例外吗?
测试类
class SingInFacebookPresenterTest {
@Mock
private lateinit var view: SignInFacebookContract.View
@Mock
private lateinit var repository: Repository
@Captor
private lateinit var callback: ArgumentCaptor<RepositoryCallback.FacebookLoginImp>
private lateinit var presenter: SingInFacebookPresenter
private val serverToken = "token"
@Before
fun init() {
MockitoAnnotations.initMocks(this)
presenter = SingInFacebookPresenter(MockContext(), repository, view)
}
@Test
fun facebook_login_success() {
//Given
val token = "token"
val serverToken = "server token"
presenter.loginViaFacebook(token)
//When
verify(repository).loginViaFacebook(token, callback.capture())
callback.value.onSuccess(serverToken)
//Then
verify(view).success(serverToken)
}
演讲者
class SingInFacebookPresenter(var context: Context, var repository: Repository, var view: SignInFacebookContract.View): SignInFacebookContract.Presenter {
public override fun loginViaFacebook(token: String) {
repository.loginViaFacebook(token, object : RepositoryCallback.FacebookLoginImp {
override fun onSuccess(token: String) {
view.success(token)
}
override fun onFailure() {
view.onFailure()
}
})
}
存储库
open class Repository(context: Context) {
init {
ApiHelper(context)
}
private var facebookLoginPresenterCallback: RepositoryCallback.FacebookLoginImp? = null
fun loginViaFacebook(token: String, facebookLoginPresenterCallback: RepositoryCallback.FacebookLoginImp?) {
// this.facebookLoginPresenterCallback = facebookLoginPresenterCallback
val signInResponse = ApiHelper.signInViaFacebook(token)
// signInResponse.enqueue(signInFacebookCallback)
signInResponse.enqueue(object : Callback<SignInResponse> {
override fun onResponse(call: Call<SignInResponse>?, response: Response<SignInResponse>?) {
if (response!!.isSuccessful) {
val token = response.body()?.token ?: return
facebookLoginPresenterCallback?.onSuccess(token)
return
}
facebookLoginPresenterCallback?.onFailure()
}
override fun onFailure(call: Call<SignInResponse>?, t: Throwable?) {
facebookLoginPresenterCallback?.onFailure()
}
})
}
private val signInFacebookCallback = object : Callback<SignInResponse> {
override fun onResponse(call: Call<SignInResponse>?, response: Response<SignInResponse>?) {
if (response!!.isSuccessful) {
val token = response.body()?.token ?: return
facebookLoginPresenterCallback?.onSuccess(token)
return
}
facebookLoginPresenterCallback?.onFailure()
}
override fun onFailure(call: Call<SignInResponse>?, t: Throwable?) {
facebookLoginPresenterCallback?.onFailure()
}
}
}
例外:
Exception in thread "OkHttp Dispatcher" java.lang.NoSuchMethodError: okhttp3.internal.Platform.log(Ljava/lang/String;)V
at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:109)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:157)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
at okhttp3.RealCall.access$100(RealCall.java:30)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "OkHttp Dispatcher" java.lang.NoSuchMethodError: okhttp3.internal.Platform.log(Ljava/lang/String;)V
at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:109)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:157)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
at okhttp3.RealCall.access$100(RealCall.java:30)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
org.mockito.exceptions.base.MockitoException:
No argument value was captured!
You might have forgotten to use argument.capture() in verify()...
...or you used capture() in stubbing but stubbed method was not called.
Be aware that it is recommended to use capture() only with verify()
Examples of correct argument capturing:
ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());
【问题讨论】:
标签: android unit-testing testing mockito kotlin