Возникли проблемы при написании юнит-теста для Kotlin Object - PullRequest
0 голосов
/ 15 марта 2019

Имея логику 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 ()

, пожалуйста, сообщите.

Спасибо.

1 Ответ

0 голосов
/ 16 марта 2019

Как вы упомянули, вы должны проверить, что когда вы регистрируете данные, они должны храниться в репо в нужном вам формате, и вы хотите проверить это в основном, когда вы дали работу по отправке журнала в 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)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...