私はテストを書くこととMockitoを使うのが初めてです。 私はここでStackoverflowに関する似たような話題を読んで、提案された変更を加えました。クラス/インターフェース/メソッドが公開されていることを確認しました。Mockito募集していますが、呼び出されていません
モックコンストラクタを注入依存関係
これは私がこれまで
class RegistrationPresenterTest {
@Test
fun testRegisterSuccess() {
val mockService = mock<IHerokuInteractor>()
val mockLocal = mock<ILocalStorageInteractor>()
val mockView = mock<RegisterView>()
val mockRegistrationResponse = HerokuRegisterResponse("hash")
val mockPair = ImeiPair("imei","hash")
val presenter = RegisterPresenterImpl(mockLocal,mockService)
whenever(mockService.register(any())).thenReturn(Observable.just(mockRegistrationResponse))
whenever(mockLocal.clearPreferences()).thenReturn(Observable.just(true))
whenever(mockLocal.putImeiPair(any())).thenReturn(Observable.just(true))
//whenever(presenter.writeImeiPairLocally(any())) How do I specify parameters since it uses a parameter from the register method?
presenter.bindView(mockView)
presenter.register("imei","male")
verify(mockService, times(1)).register(any())
verify(mockLocal,times(1)).clearPreferences()
verify(mockLocal,times(1)).putImeiPair(any())
verify(mockView,times(1)).moveToMain()
}
が、私は入れません応答が
Wanted but not invoked:
registerPresenterImpl.writeImeiPairLocally(
<any com.company.appname.model.ImeiPair>
);
Actually, there were zero interactions with this mock.
で思い付いたテストがあります
私はテストでその方法について言及していないときでも私はこの応答を得た。 これは私のプレゼンターの登録方法です。私はクラス/インターフェイスを変更しました&メソッドを開く(kotlin)に関与。私はオーバライドメソッドが本質的にkotlinで開いていると信じています。
open class RegisterPresenterImpl @Inject constructor(val localStorage : ILocalStorageInteractor, var herokuService : IHerokuInteractor)
override fun register(imei : String, gender : String){
subscription = herokuService.register(RegisterObject(imei,gender)).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(
{
registrationResult ->
Log.d(TAG,"${registrationResult}")
if(registrationResult.imei_hash != null){
writeImeiPairLocally(ImeiPair(imei,registrationResult.imei_hash))
}
else{
Log.e(TAG,"User already exists")
}
},
{
errorResponse -> Log.e(TAG,"Could not register user ${errorResponse.message}")
}
)
addSubscription(subscription)
}
と同様にここ
open fun writeImeiPairLocally(pair : ImeiPair){
subscription = localStorage.clearPreferences().flatMap {
cleared -> localStorage.putImeiPair(pair)}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(
{
booleanResult -> view?.moveToMain()
},
{
errorResponse -> Log.e(TAG,"Could not write ImeiPair to SharedPreferences ${errorResponse.message}")
}
)
addSubscription(subscription)
}
は、すべてのヘルプが理解されるインターフェース
open interface ILocalStorageInteractor : ILocalStorage{
fun getImeiPair() : Observable<ImeiPair>
fun putImeiPair(pair: ImeiPair) : Observable<Boolean>
}
open interface ILocalStorage {
fun clearPreferences() : Observable<Boolean>
}
あります。
が応答をいただき、ありがとうございます。 BeforeメソッドsetUp()とAfter tearDown()の最後のブロックに最初の2ブロックのコードを追加しましたが、同じ応答が得られます。これは提案された変更を実装する正しい方法でしたか?私は前にテストをしたことがない。 – buddhabath
'register(imei:String、gender:String)'関数からonNext呼び出しの中でデバッガを使用しようとしましたか? –
テストを動かした後(インストゥルメントテスト中)、代わりに同じエラーが表示されますが、clearPreferences()の場合、元の投稿の一番下を確認してください。最初は、私の発表者のLogging()を黙らせないことに苦情を言いました – buddhabath