Не может издеваться над котлиным методом запечатанного объекта - PullRequest
0 голосов
/ 15 октября 2018

У меня есть запечатанный класс, который содержит объект с методом, который мне нужно смоделировать.Я попытался использовать Powermock для этого, но метод не поддразнивается (любые вызовы в тесте просто вызывают оригинальный метод).Вот пример закрытого класса:

sealed class UseCase<in P> {
    operator fun invoke(parameters: P): Flowable<Result> {
        return execute(parameters)
    }

    object GetQuestions : UseCase<GetQuestionsParams>() {
        override fun execute(params: GetQuestionsParams): Flowable<Result> {
            return Api.getQuestions()
                      .subscribeOn(Schedulers.io())
                      .map { Result.create(it) }
        }
    }
}

И тестовый класс:

@RunWith(PowerMockRunner::class)
@PrepareForTest(UseCase::class, UseCase.GetQuestions::class)
class QuestionsPresenterTest {

    private val presenter = QuestionsPresenter()

    @Before
    fun setUp() {
        initMocks(this)
        PowerMockito.mockStatic(UseCase::class.java)
        PowerMockito.mockStatic(UseCase.GetQuestions::class.java)
    }

    @Test
    fun `test getQuestions with error response`() {
        PowerMockito.`when`(UseCase.GetQuestions.invoke(any())) doReturn Flowable.error(IllegalArgumentException("test error"))

        presenter.getQuestions()

        //...verification etc
    }
}

К сожалению, когда я запускаю это, я либо получаю исключения нулевого указателя вокруг внутренних частей этого PowerMockito. when вызывать, если я использую реальное значение в вызове вместо сопоставления any () или IllegalArgumentException, описанного как «Обнаружен неуместный или неправильно использованный сопоставитель аргументов», если я использую сопоставление any (), которое предполагает, что ничего не было смоделировановообще и настоящая функция вызывается.У кого-нибудь есть идеи?

...