Kotlin 1.2, retrofit2 unit testing, How to mock subscribe with mockito?












0















I need help. I'm using Kotlin 1.2, RxJava2 (2.0.2), Retrofit2 (2.4.0) and mockito (2.22.0). I have MVP project I need to test. I want to know if function getPastEventList reach result block and not error block. Optionally, I should know the data received inside result block.



My Presenter is like this:



import android.content.Context
import android.widget.Toast
import ..ApiService
import ..RxJavaUtils
import ..MatchesView
import io.reactivex.disposables.Disposable

class MatchesPresenter(
private val view: MatchesView
, private val apiService: ApiService
) {

fun getPastEventList(context: Context?, eventId: Int): Disposable? {
view.showLoading()

return apiService.getPastMatches(eventId.toString())
.subscribeOn(RxJavaUtils.getSubscriberOn.invoke())
.observeOn(RxJavaUtils.getObserveOn.invoke())
.subscribe(
{ result -> //I want to know via mockito, if this request reach here (not reaching to error block below)
run {
view.hideLoading()
view.showEventList(
result.events //optional: I want to get this data via mockito
)
}
},
{ error -> //I want to know via mockito, if this request not reach here
Toast.makeText(context, error.message, Toast.LENGTH_SHORT).show()
}
)
}


my ApiService is like this:



interface ApiService {
@GET("eventspastleague.php")
fun getPastMatches(@Query("id") action: String):
Observable<EventModel.Events>
}


RxJavaUtils class is like this:



import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers

object RxJavaUtils {
var getSubscriberOn = { Schedulers.io() }
var getObserveOn = { AndroidSchedulers.mainThread() }
}


And my attempt so far is like this:



import android.content.Context
import ..RxJavaUtils.getObserveOn
import ..RxJavaUtils.getSubscriberOn
import ..model.EventModel
import ..presenter.MatchesPresenter
import ..view.MatchesView
import io.reactivex.schedulers.Schedulers
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.mockito.MockitoAnnotations

class MatchesPresenterTest {

@Mock
private
lateinit var view: MatchesView

@Mock
private lateinit var presenter: MatchesPresenter

@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
presenter = MatchesPresenter(view, ApiService.create())
}

@Before
fun init() {
getSubscriberOn = { Schedulers.from { command -> command.run() } } //Runs in current thread
getObserveOn = { Schedulers.from { command -> command.run() } } //runs also in current thread
}

@Test
fun testGetPastEventList() {
val context = mock(Context::class.java)
var events : List<EventModel.Event>

val eventId = 4328;

`when`(
presenter.getPastEventList(context, eventId) //return Disposable
)
.thenReturn( //did I wrong, if I am using this method to know subscribe result?
//what to do?
)
// do I need to call another method?
}

}


I'm really stuck. I've read many stackoverflow & medium posts, but seems none of those articles can be applied here. Many thanks for any help.










share|improve this question





























    0















    I need help. I'm using Kotlin 1.2, RxJava2 (2.0.2), Retrofit2 (2.4.0) and mockito (2.22.0). I have MVP project I need to test. I want to know if function getPastEventList reach result block and not error block. Optionally, I should know the data received inside result block.



    My Presenter is like this:



    import android.content.Context
    import android.widget.Toast
    import ..ApiService
    import ..RxJavaUtils
    import ..MatchesView
    import io.reactivex.disposables.Disposable

    class MatchesPresenter(
    private val view: MatchesView
    , private val apiService: ApiService
    ) {

    fun getPastEventList(context: Context?, eventId: Int): Disposable? {
    view.showLoading()

    return apiService.getPastMatches(eventId.toString())
    .subscribeOn(RxJavaUtils.getSubscriberOn.invoke())
    .observeOn(RxJavaUtils.getObserveOn.invoke())
    .subscribe(
    { result -> //I want to know via mockito, if this request reach here (not reaching to error block below)
    run {
    view.hideLoading()
    view.showEventList(
    result.events //optional: I want to get this data via mockito
    )
    }
    },
    { error -> //I want to know via mockito, if this request not reach here
    Toast.makeText(context, error.message, Toast.LENGTH_SHORT).show()
    }
    )
    }


    my ApiService is like this:



    interface ApiService {
    @GET("eventspastleague.php")
    fun getPastMatches(@Query("id") action: String):
    Observable<EventModel.Events>
    }


    RxJavaUtils class is like this:



    import io.reactivex.android.schedulers.AndroidSchedulers
    import io.reactivex.schedulers.Schedulers

    object RxJavaUtils {
    var getSubscriberOn = { Schedulers.io() }
    var getObserveOn = { AndroidSchedulers.mainThread() }
    }


    And my attempt so far is like this:



    import android.content.Context
    import ..RxJavaUtils.getObserveOn
    import ..RxJavaUtils.getSubscriberOn
    import ..model.EventModel
    import ..presenter.MatchesPresenter
    import ..view.MatchesView
    import io.reactivex.schedulers.Schedulers
    import org.junit.Before
    import org.junit.Test
    import org.mockito.Mock
    import org.mockito.Mockito.`when`
    import org.mockito.Mockito.mock
    import org.mockito.MockitoAnnotations

    class MatchesPresenterTest {

    @Mock
    private
    lateinit var view: MatchesView

    @Mock
    private lateinit var presenter: MatchesPresenter

    @Before
    fun setUp() {
    MockitoAnnotations.initMocks(this)
    presenter = MatchesPresenter(view, ApiService.create())
    }

    @Before
    fun init() {
    getSubscriberOn = { Schedulers.from { command -> command.run() } } //Runs in current thread
    getObserveOn = { Schedulers.from { command -> command.run() } } //runs also in current thread
    }

    @Test
    fun testGetPastEventList() {
    val context = mock(Context::class.java)
    var events : List<EventModel.Event>

    val eventId = 4328;

    `when`(
    presenter.getPastEventList(context, eventId) //return Disposable
    )
    .thenReturn( //did I wrong, if I am using this method to know subscribe result?
    //what to do?
    )
    // do I need to call another method?
    }

    }


    I'm really stuck. I've read many stackoverflow & medium posts, but seems none of those articles can be applied here. Many thanks for any help.










    share|improve this question



























      0












      0








      0








      I need help. I'm using Kotlin 1.2, RxJava2 (2.0.2), Retrofit2 (2.4.0) and mockito (2.22.0). I have MVP project I need to test. I want to know if function getPastEventList reach result block and not error block. Optionally, I should know the data received inside result block.



      My Presenter is like this:



      import android.content.Context
      import android.widget.Toast
      import ..ApiService
      import ..RxJavaUtils
      import ..MatchesView
      import io.reactivex.disposables.Disposable

      class MatchesPresenter(
      private val view: MatchesView
      , private val apiService: ApiService
      ) {

      fun getPastEventList(context: Context?, eventId: Int): Disposable? {
      view.showLoading()

      return apiService.getPastMatches(eventId.toString())
      .subscribeOn(RxJavaUtils.getSubscriberOn.invoke())
      .observeOn(RxJavaUtils.getObserveOn.invoke())
      .subscribe(
      { result -> //I want to know via mockito, if this request reach here (not reaching to error block below)
      run {
      view.hideLoading()
      view.showEventList(
      result.events //optional: I want to get this data via mockito
      )
      }
      },
      { error -> //I want to know via mockito, if this request not reach here
      Toast.makeText(context, error.message, Toast.LENGTH_SHORT).show()
      }
      )
      }


      my ApiService is like this:



      interface ApiService {
      @GET("eventspastleague.php")
      fun getPastMatches(@Query("id") action: String):
      Observable<EventModel.Events>
      }


      RxJavaUtils class is like this:



      import io.reactivex.android.schedulers.AndroidSchedulers
      import io.reactivex.schedulers.Schedulers

      object RxJavaUtils {
      var getSubscriberOn = { Schedulers.io() }
      var getObserveOn = { AndroidSchedulers.mainThread() }
      }


      And my attempt so far is like this:



      import android.content.Context
      import ..RxJavaUtils.getObserveOn
      import ..RxJavaUtils.getSubscriberOn
      import ..model.EventModel
      import ..presenter.MatchesPresenter
      import ..view.MatchesView
      import io.reactivex.schedulers.Schedulers
      import org.junit.Before
      import org.junit.Test
      import org.mockito.Mock
      import org.mockito.Mockito.`when`
      import org.mockito.Mockito.mock
      import org.mockito.MockitoAnnotations

      class MatchesPresenterTest {

      @Mock
      private
      lateinit var view: MatchesView

      @Mock
      private lateinit var presenter: MatchesPresenter

      @Before
      fun setUp() {
      MockitoAnnotations.initMocks(this)
      presenter = MatchesPresenter(view, ApiService.create())
      }

      @Before
      fun init() {
      getSubscriberOn = { Schedulers.from { command -> command.run() } } //Runs in current thread
      getObserveOn = { Schedulers.from { command -> command.run() } } //runs also in current thread
      }

      @Test
      fun testGetPastEventList() {
      val context = mock(Context::class.java)
      var events : List<EventModel.Event>

      val eventId = 4328;

      `when`(
      presenter.getPastEventList(context, eventId) //return Disposable
      )
      .thenReturn( //did I wrong, if I am using this method to know subscribe result?
      //what to do?
      )
      // do I need to call another method?
      }

      }


      I'm really stuck. I've read many stackoverflow & medium posts, but seems none of those articles can be applied here. Many thanks for any help.










      share|improve this question
















      I need help. I'm using Kotlin 1.2, RxJava2 (2.0.2), Retrofit2 (2.4.0) and mockito (2.22.0). I have MVP project I need to test. I want to know if function getPastEventList reach result block and not error block. Optionally, I should know the data received inside result block.



      My Presenter is like this:



      import android.content.Context
      import android.widget.Toast
      import ..ApiService
      import ..RxJavaUtils
      import ..MatchesView
      import io.reactivex.disposables.Disposable

      class MatchesPresenter(
      private val view: MatchesView
      , private val apiService: ApiService
      ) {

      fun getPastEventList(context: Context?, eventId: Int): Disposable? {
      view.showLoading()

      return apiService.getPastMatches(eventId.toString())
      .subscribeOn(RxJavaUtils.getSubscriberOn.invoke())
      .observeOn(RxJavaUtils.getObserveOn.invoke())
      .subscribe(
      { result -> //I want to know via mockito, if this request reach here (not reaching to error block below)
      run {
      view.hideLoading()
      view.showEventList(
      result.events //optional: I want to get this data via mockito
      )
      }
      },
      { error -> //I want to know via mockito, if this request not reach here
      Toast.makeText(context, error.message, Toast.LENGTH_SHORT).show()
      }
      )
      }


      my ApiService is like this:



      interface ApiService {
      @GET("eventspastleague.php")
      fun getPastMatches(@Query("id") action: String):
      Observable<EventModel.Events>
      }


      RxJavaUtils class is like this:



      import io.reactivex.android.schedulers.AndroidSchedulers
      import io.reactivex.schedulers.Schedulers

      object RxJavaUtils {
      var getSubscriberOn = { Schedulers.io() }
      var getObserveOn = { AndroidSchedulers.mainThread() }
      }


      And my attempt so far is like this:



      import android.content.Context
      import ..RxJavaUtils.getObserveOn
      import ..RxJavaUtils.getSubscriberOn
      import ..model.EventModel
      import ..presenter.MatchesPresenter
      import ..view.MatchesView
      import io.reactivex.schedulers.Schedulers
      import org.junit.Before
      import org.junit.Test
      import org.mockito.Mock
      import org.mockito.Mockito.`when`
      import org.mockito.Mockito.mock
      import org.mockito.MockitoAnnotations

      class MatchesPresenterTest {

      @Mock
      private
      lateinit var view: MatchesView

      @Mock
      private lateinit var presenter: MatchesPresenter

      @Before
      fun setUp() {
      MockitoAnnotations.initMocks(this)
      presenter = MatchesPresenter(view, ApiService.create())
      }

      @Before
      fun init() {
      getSubscriberOn = { Schedulers.from { command -> command.run() } } //Runs in current thread
      getObserveOn = { Schedulers.from { command -> command.run() } } //runs also in current thread
      }

      @Test
      fun testGetPastEventList() {
      val context = mock(Context::class.java)
      var events : List<EventModel.Event>

      val eventId = 4328;

      `when`(
      presenter.getPastEventList(context, eventId) //return Disposable
      )
      .thenReturn( //did I wrong, if I am using this method to know subscribe result?
      //what to do?
      )
      // do I need to call another method?
      }

      }


      I'm really stuck. I've read many stackoverflow & medium posts, but seems none of those articles can be applied here. Many thanks for any help.







      kotlin mockito retrofit2 rx-java2






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 15 '18 at 7:06







      Dika

















      asked Nov 15 '18 at 6:24









      DikaDika

      7001126




      7001126
























          0






          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53313582%2fkotlin-1-2-retrofit2-unit-testing-how-to-mock-subscribe-with-mockito%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53313582%2fkotlin-1-2-retrofit2-unit-testing-how-to-mock-subscribe-with-mockito%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Xamarin.iOS Cant Deploy on Iphone

          Glorious Revolution

          Dulmage-Mendelsohn matrix decomposition in Python