为 Kotlin 对象编写单元测试时遇到问题
Having trouble writing unit test for Kotlin Object
考虑到 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 访问存储库(这有效)
我被卡住的地方是我正在尝试对 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() 方法
请指教
谢谢。
正如你提到的,你必须测试当你记录数据时,它应该以你想要的格式存储在 repo 中,并且你想要基本上测试当你将日志发送到的工作时记录器,它将以正确的格式发送到存储库,您将对此进行断言。
所以你的测试用例看起来像,
@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)
}
考虑到 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 访问存储库(这有效)
我被卡住的地方是我正在尝试对 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() 方法
请指教
谢谢。
正如你提到的,你必须测试当你记录数据时,它应该以你想要的格式存储在 repo 中,并且你想要基本上测试当你将日志发送到的工作时记录器,它将以正确的格式发送到存储库,您将对此进行断言。
所以你的测试用例看起来像,
@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)
}