Mockk: io.mockk.MockKException: Bad recording sequence. Please finalize every { ... } block with returns/answers/just Runs

Created on 19 Nov 2018  路  4Comments  路  Source: mockk/mockk

  • MockK version: 1.8.13
  • OS: Android
  • Kotlin version: 1.3.10
  • JDK version: 1.8
  • JUnit version: 5
  • Type of test: unit test OR android instrumented test

Stack trace

io.mockk.MockKException: Bad recording sequence. Please finalize every { ... } block with returns/answers/just Runs
class NoPermissionsPresenterTest : RxSpek({
    val view = mockk<NoPermissionsContract.View> {
        every { onVisibilityChangeObservable } returns Observable.just(true)
    }
    val navigator = mockk<NoPermissionsContract.Navigator> {
        every { back() } returns Unit
    }

    val rxPermissions = mockk<RxPermissions> {
        every { isGranted(any()) } returns true
    }
    val presenter by memoized(CachingMode.GROUP) {
        NoPermissionsPresenter(
            rxPermissions = rxPermissions,
            navigator = navigator
        )
    }

    describe("NoPermissionsPresenter tests") {
        describe("view observables") {
            beforeGroup {
                presenter.attachView(view)
            }
            on("visibility change to true") {
               view.onVisibilityChangeObservable.test()
                it("check permissions") {
                    verify { rxPermissions.isGranted("") }
                }
                it("navigates back") {
                    verify { navigator.back() }
                }
            }
        }
    }
})

Most helpful comment

Just in case someone stumbles on this, in my case it was having trouble with the answer being an expression/function.

every { mockObj.func() } returns someObject.fakeAnswer()

But this worked:

val fakeAnswer = someAnswerObject.funcAnswer()
every { mockObj.func()} returns fakeAnswer

All 4 comments

Hey, can I ask what was the problem?

In my case I forgot the returns statement after the every block with captured variables, e.g.:

val slot = slot<File>()
val fileRepo = mockk<FileRepository>()
every { fileRepo.upload(capture(slot), "test") } 

correct was :

val slot = slot<File>()
val fileRepo = mockk<FileRepository>()
every { fileRepo.upload(capture(slot), "test") } returns "test"

Just in case someone stumbles on this, in my case it was having trouble with the answer being an expression/function.

every { mockObj.func() } returns someObject.fakeAnswer()

But this worked:

val fakeAnswer = someAnswerObject.funcAnswer()
every { mockObj.func()} returns fakeAnswer

@patrickcousins Ha, wasn't that fixed in 1.9.1 ? :smile: Now whole hierarchies are allowed in returns https://mockk.io/#hierarchical-mocking, there should be basically no limits on returns clause.

Was this page helpful?
0 / 5 - 0 ratings