Производительность Мокито с использованием шпиона против шпиона - PullRequest
0 голосов
/ 08 января 2020

Допустим, у меня есть «Ведущий»:

class Presenter

, и я напишу несколько тестов для этого класса.

Существует два способа создания докладчика:

1.

class PresenterTests {

    @Test
    fun test_attach() { 
       val presenter = Presenter()

       // presenter.doThings()
       // verify / asserts
    }
}

2.

class PresenterTests {

    @Test
    fun test_attach() { 
       val presenter = spy(Presenter())

       // presenter.doThings()
       // verify / asserts
    }
}

Есть ли проблемы с производительностью, если я всегда использую шпион для всех своих объектов и просто проверяю их всякий раз, когда это действительно необходимо?

1 Ответ

1 голос
/ 08 января 2020

Мне не известно о каком-либо существенном снижении производительности при использовании spy(), но вы можете ввести неожиданное или нежелательное поведение по другим причинам, если будете шпионить за всем.

С Javado c for spy () :

Mockito не делегирует вызовы переданному реальному экземпляру, а фактически создает его копию. Поэтому, если вы сохраняете реальный экземпляр и взаимодействуете с ним, не ожидайте, что шпион узнает об этом взаимодействии и его влиянии на состояние реального экземпляра. Следствие состоит в том, что когда unstubbed метод вызывается на шпионе , но не на реальном экземпляре , вы не увидите никаких эффектов на реальном экземпляре.

Это может привести к неожиданному поведению в ваших тестах - в зависимости от того, как они написаны - если вы будете использовать spy() везде.

Остерегайтесь финальных методов. Mockito не высмеивает финальные методы, поэтому суть в следующем: когда вы шпионите за реальными объектами +, вы пытаетесь заглушить финальный метод = проблема. Также вы не сможете проверить этот метод.

Это ограничение в Mockito, которое может привести к проблемам.

Также есть это утверждение (из того же Javado c), которое противоречит идее шпионить за всем :

Настоящих шпионов следует использовать осторожно и время от времени, например, при работе с устаревшим кодом.

...