KoinAppAlreadyStartedException:Koin应用程序已启动

时间:2019-07-15 11:34:28

标签: testing kotlin koin

使用koin-2.0.1进行Android测试,尽管每个测试分别通过,但无法同时测试所有3个测试。

<div id="map" tabindex="1"></div>

正在运行的类级别测试结果如下:

var interactions = ol.interaction.defaults({ 
  onFocusOnly: true, 
  altShiftDragRotate: false, 
  pinchRotate: false, 
  doubleClickZoom: false, 
  pinchZoom: false, 
  dragZoom: false, 
  dragPan: false, 
  dragRotate: false, 
  mouseWheelZoom: false 
});

new ol.Map({
    target: "map"
    interactions: interactions,
    layers: [],
    view: new ol.View({
        center: ol.proj.transform([15.523, 49.718], 'EPSG:4326', 'EPSG:3857'),
        zoom: 8,
        minZoom: 7,
        maxZoom: 18
    })
});

任何输入都会有所帮助,谢谢。

5 个答案:

答案 0 :(得分:2)

一种常见的做法是将@Before设置与@After清理配对。您可以在那里致电stopKoin(),以便再次致电startKoin()

@After
fun tearDown() {
    stopKoin()
}

答案 1 :(得分:1)

作为@After方法的替代方法,您也可以使用AutoCloseKoinTestAs described in the docs

  

扩展的Koin测试-嵌入自动关闭@after方法以在每次测试后关闭Koin

您可以扩展KoinTest而不是扩展AutoCloseKoinTest,它将为您做事后测试。

答案 2 :(得分:1)

解决此问题的另一种方法是,在您启动Koin的应用程序中覆盖onTerminate

override fun onTerminate() {
    super.onTerminate()     
    stopKoin()              
}

通过这种方式,您将不必使用AutoCloseKoinTest或在@after的每个类测试中将其关闭

答案 3 :(得分:0)

在@Before和@After方法上调用stopKoin(),如下所示:

import com.my.example.appModule
import android.os.Build
import androidx.test.core.app.ApplicationProvider
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.test.KoinTest
import org.koin.test.inject
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import java.util.*

@Config(sdk = [Build.VERSION_CODES.LOLLIPOP])
@RunWith(RobolectricTestRunner::class)
class SomeRepositoryTest: KoinTest {

    // Return Completable of RxJava
    private val repository: SomeRepository by inject()

    @Before
    fun before() {
        stopKoin() // to remove 'A Koin Application has already been started'
        startKoin {
            androidContext(ApplicationProvider.getApplicationContext())
            modules(appModule)
        }
    }

    @After
    fun after() {
        stopKoin()
    }

    @Test
    fun testSomething() {

        repository.insert("data").blockingAwait()

        assert(true)
    }
}

答案 4 :(得分:0)

实施抽象的AutoCloseKoinTest类将在每次测试后自动停止Koin。

以下是Robolectric的示例:

@RunWith(RoboelectricTestRunner::class)
class MyTest : AutoCloseKoinTest() {
   private val appContext = ApplicationProvider.getApplicationContext<APPNAME>()

   @Before
   fun setup() {
      // use appContext as needed
   }
}