Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @PerFragment
- class SomeViewModel @Inject constructor(private val someActionUseCase: SomeActionUseCase,
- someUpdateStateUseCase: SomeUpdateStateUseCase) : ViewModel() {
- private val someState = MutableLiveData<SomeState>()
- private val stateSubscription: Disposable
- // region Lifecycle
- init {
- stateSubscription = someUpdateStateUseCase.state()
- .subscribeIoObserveMain() // extension function
- .subscribe { newState ->
- someState.value = newState
- })
- }
- override fun onCleared() {
- stateSubscription.dispose()
- super.onCleared()
- }
- // endregion
- // region Public Functions
- fun someState() = someState
- fun someAction(someValue: Boolean) {
- val someNewValue = if (someValue) "This" else "That"
- someActionUseCase.someAction(someNewValue)
- }
- // endregion
- }
- @Singleton
- class UpdateSomeStateUseCase @Inject constructor(
- private var state: SomeState = initialState) {
- private val statePublisher: PublishProcessor<SomeState> =
- PublishProcessor.create()
- fun update(state: SomeState) {
- this.state = state
- statePublisher.onNext(state)
- }
- fun state(): Observable<SomeState> = statePublisher.toObservable()
- .startWith(state)
- }
- @RunWith(JUnitPlatform::class)
- class SomeViewModelTest : SubjectSpek<SomeViewModel>({
- instantTaskExecutorRuleStart()
- var mockSomeActionUseCase = mock<SomeActionUseCase>()
- var mockSomeUpdateStateUseCase = mock<SomeUpdateStateUseCase>()
- var liveState = MutableLiveData<SomeState>()
- val initialState = SomeState(initialValue)
- val newState = SomeState(newValue)
- val behaviorSubject = BehaviorSubject.createDefault(initialState)
- subject {
- mockSomeActionUseCase = mock()
- mockSomeUpdateStateUseCase = mock()
- whenever(mockSomeUpdateStateUseCase.state()).thenReturn(behaviorSubject)
- SomeViewModel(mockSomeActionUseCase, mockSomeUpdateStateUseCase).apply {
- liveState = state() as MutableLiveData<SomeState>
- }
- }
- beforeGroup { setTestRxAndLiveData() }
- afterGroup { resetTestRxAndLiveData(subject) }
- context("some screen") {
- given("the action to open the screen") {
- on("screen opened") {
- subject
- behaviorSubject.startWith(initialState)
- it("displays the initial state") {
- assertEquals(liveState.value, initialState)
- }
- }
- }
- given("some setup") {
- on("some action") {
- it("does something") {
- subject.doSomething(someValue)
- verify(mockSomeUpdateStateUseCase).someAction(someOtherValue)
- }
- }
- on("action updating the state") {
- it("displays new state") {
- behaviorSubject.onNext(newState)
- assertEquals(liveState.value, newState)
- }
- }
- }
- }
- }
- var observable = Observable.just(initialState)
- ...
- whenever(mockSomeUpdateStateUseCase.state()).thenReturn(observable)
- ...
- observable = Observable.just(newState)
- assertEquals(liveState.value, newState)
- val behaviorSubject = BehaviorSubject.createDefault(initialState)
- ...
- whenever(mockSomeUpdateStateUseCase.state()).thenReturn(behaviorSubject)
- ...
- behaviorSubject.onNext(newState)
- assertEquals(liveState.value, newState)
- fun instantTaskExecutorRuleStart() =
- ArchTaskExecutor.getInstance().setDelegate(object : TaskExecutor() {
- override fun executeOnDiskIO(runnable: Runnable) {
- runnable.run()
- }
- override fun isMainThread(): Boolean {
- return true
- }
- override fun postToMainThread(runnable: Runnable) {
- runnable.run()
- }
- })
- fun instantTaskExecutorRuleFinish() = ArchTaskExecutor.getInstance().setDelegate(null)
- fun setRxSchedulersTrampolineOnMain() = RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.trampoline() }
- fun setTestRxAndLiveData() {
- setRxSchedulersTrampolineOnMain()
- instantTaskExecutorRuleStart()
- }
- fun resetTestRxAndLiveData() {
- RxAndroidPlugins.reset()
- instantTaskExecutorRuleFinish()
- }
- fun <T> Observable<T>.subscribeIoObserveMain(): Observable<T> =
- subscribeOnIoThread().observeOnMainThread()
- fun <T> Observable<T>.subscribeOnIoThread(): Observable<T> = subscribeOn(Schedulers.io())
- fun <T> Observable<T>.observeOnMainThread(): Observable<T> =
- observeOn(AndroidSchedulers.mainThread())
Add Comment
Please, Sign In to add comment