首页 > 解决方案 > 为 Kotlin 对象编写单元测试时遇到问题

问题描述

考虑到 TDD 的逻辑并尝试了解如何编写单元测试,我在使用 Kotlin 对象时遇到了麻烦。测试通过,但我不确定这是否真的是正确的测试。我正在尝试确保调用 Logger.i() 方法并将其保存到数据库中。但目前我只停留在它的调用部分。

我的对象

object Logger {
    fun i(tag: String, msg: String, tr: Throwable? = null): Int  {
        insertIntoLogDatabase(createLogModel("i", tag, msg, tr))
        return if (BuildConfig.DEBUG) Log.i(tag, msg, tr) else 0
    }

    private fun insertIntoLogDatabase(log: LogModel) {
        //Insert into Log DB
        logRepo.upsert(log)
    }

    private fun createLogModel(type: String, tag: String, msg: String, tr: Throwable?) = LogModel(0, type, tag, msg, if (tr != null) tr.message + "\n" + tr?.stackTrace.contentToString() else null)

    fun setLogRepo(logRepo: LogRepository) {
        this.logRepo = logRepo
    }
}

有了这个,我知道我必须调用 Logger.setLogRepo(logRemp) 来让 Logger 访问 repo(这有效)

我被卡住的地方是我正在尝试对 Log.i 方法调用进行单元测试

我有这个

@Mock
lateinit var log: Logger

@Before
fun setUp() {
    MockitoAnnotations.initMocks(this)

    Logger.setLogRepository(logRepo)
}

@Test
fun `log i failed`() {

    // When
    log.i("Test", "Test1")

    // Then
    verify(log, times(1)).i("Test", "Test1")
}

我的意思是这可行,但它是否正确(我的直觉告诉我,我实际上并没有测试 Logger.i() 方法是错误的

请指教。

谢谢。

标签: unit-testingobjectkotlintdd

解决方案


正如您所提到的,您必须测试当您记录数据时,它应该以您想要的格式存储在 repo 中,并且您基本上想要测试当您完成向 Logger 发送日志的工作时,它是以正确的格式发送到存储库,您将对此提出异议。

所以你的测试用例看起来像,

@Mock
lateinit var logRepo: LogRepository

@Before
fun setUp() {
    MockitoAnnotations.initMocks(this)

    Logger.setLogRepository(logRepo)
}

@Test
fun `when an item is logged, it gets stored in the repository`()
{
  val expectedData= <valueThatShouldBeSentToRepo>

  Logger.i("Test", "Test1")

  verify(logRepo).upsert(expectedData)

}

推荐阅读