mockK не может различать типы в каждом утверждении - PullRequest
0 голосов
/ 19 июня 2020

Я пишу метод в Kotlin, который возвращает индексы elasticsearch, которым назначен псевдоним:

    fun getActiveIndices(cluster: ElasticsearchCluster): List<IndexModel> {
        val aliases = elasticsearchCommandExecutor.execute(GetAllAliasesCommand(cluster))
        val indices = elasticsearchCommandExecutor.execute(GetAllIndicesCommand(cluster))
        indices.forEach{ it.active = aliases.any { alias -> it.name == alias.index } }
        return indices.filter { !it.irregular && it.active }
    }

Где GetAllAliasesCommand и GetAllIndicesCommand являются подклассами ElasticsearchCommand<T>. Я пытаюсь проверить поведение этого метода с помощью mockK:

    @Test
    fun `getActiveIndices should make correct calls`() {
        val aliases = listOf(.. A list of AliasModel)
        val indices = listOf(.. A list of IndexModel)

        every { elasticsearchCommandExecutor.execute(any<GetAllAliasesCommand>()) } returns aliases
        every { elasticsearchCommandExecutor.execute(any<GetAllIndicesCommand>()) } returns indices

        val result = indexService.getActiveIndices(ElasticsearchCluster.SOME_CLUSTER)

        verify { elasticsearchCommandExecutor.execute(any<GetAllAliasesCommand>()) }
        verify { elasticsearchCommandExecutor.execute(any<GetAllIndicesCommand>()) }

        assert(result == listOf(.. A list of IndexModel))
    }

Проблема в том, что mockK не может различать any<GetAllIndicesCommand>() и any<GetAllAliasesCommand>() в операторе every, поэтому оба elasticsearchCommandExecutor.execute(any<GetAllIndicesCommand>()) и elasticsearchCommandExecutor.execute(any<GetAllAliasesCommand>()) возвращают indices. Это означает, что он применяет последний оператор every. Есть ли способ вернуть его в зависимости от типа команды?

1 Ответ

0 голосов
/ 19 июня 2020

Оказывается, мне пришлось использовать сопоставление ofType для этой цели. Итак, окончательный код:

    @Test
    fun `getActiveIndices should make correct calls`() {
        val aliases = listOf(.. A list of AliasModel)
        val indices = listOf(.. A list of IndexModel)

        every { elasticsearchCommandExecutor.execute(ofType(GetAllAliasesCommand::class)) } returns aliases
        every { elasticsearchCommandExecutor.execute(ofType(GetAllIndicesCommand::class)) } returns indices

        val result = indexService.getActiveIndices(ElasticsearchCluster.SOME_CLUSTER)

        verify { elasticsearchCommandExecutor.execute(ofType(GetAllIndicesCommand::class)) }
        verify { elasticsearchCommandExecutor.execute(ofType(GetAllAliasesCommand::class)) }

        assert(result == listOf(.. A list of IndexModel))
    }
...