Injecting your test classes

Instead of manually creating your own mocks & fakes, it can be useful to inject them in your test class, especially if you have multiple tests using them.

@UsesFakes(User::class)
class MyTests {
    @Mock lateinit var db: Database
    @Mock lateinit var api: API

    @Fake lateinit var user: User

    lateinit var controller: Controller

    val mocker = Mocker()

    @BeforeTest fun setUp() {
        mocker.reset() (1)
        this.injectMocks(mocker) (2)
        controller = ControllerImpl(db, api) (3)
    }

    @Test fun controllerTest() {
        mocker.every { view.render(isAny()) } returns true
        controller.start()
        mocker.verify { view.render(model) }
    }
}
1 Resets the mocker before any test (which removes all mocked behaviour & logged calls), so that each test gets a "clean" mocker.
2 Injects mocks and fakes.
3 Create classes to be tested with injected mocks & fakes.

As soon as a class T contains a @Mock or @Fake annotated property, a T.injectMocks(Mocker) function will be created by the processor.

Don’t forget to reset the Mocker in a @BeforeTest method!