JUnit Tests

This tutorial lets you test a Kotlin application and use Koin inject and retrieve your components.

Get the code

Gradle Setup

First, add the Koin dependency like below:

// Add Jcenter to your repositories if needed
repositories {
jcenter()
}
dependencies {
// Koin testing tools
testcompile "org.koin:koin-test:$koin_version"
// Needed JUnit version
testcompile "org.koin:koin-test-junit4:$koin_version"
}

Declared dependencies

We reuse the koin-core getting-started project, to use the koin module:

val helloModule = module {
single { HelloMessageData() }
single { HelloServiceImpl(get()) as HelloService }
}

Writing our first Test

To make our first test, let's write a simple Junit test file and extend it with KoinTest. We will be able then, to use by inject() operators.

class HelloAppTest : KoinTest {
val model by inject<HelloMessageData>()
val service by inject<HelloService>()
@get:Rule
val koinTestRule = KoinTestRule.create {
printLogger()
modules(helloModule)
}
@Test
fun `unit test`() {
val helloApp = HelloApplication()
helloApp.sayHello()
assertEquals(service, helloApp.helloService)
assertEquals("Hey, ${model.message}", service.hello())
}
}

We use the Koin KoinTestRule rule to start/stop our Koin context

You can even make Mocks directly into MyPresenter, or test MyRepository. Those components doesn't have any link with Koin API.

class HelloMockTest : KoinTest {
@get:Rule
val koinTestRule = KoinTestRule.create {
printLogger(Level.DEBUG)
modules(helloModule)
}
@get:Rule
val mockProvider = MockProviderRule.create { clazz ->
Mockito.mock(clazz.java)
}
@Test
fun `mock test`() {
val service = declareMock<HelloService> {
given(hello()).willReturn("Hello Mock")
}
HelloApplication().sayHello()
Mockito.verify(service,times(1)).hello()
}
}