Как проверить с помощью Mockito, что во время теста был вызван другой публичный метод SUT - PullRequest
0 голосов
/ 11 декабря 2018

Мне известно о дубликате, но там не было дано ответа о реальном вопросе.

Как проверить, вызывается ли метод в тестируемой системе (не фиктивно)

У меня есть класс:

class A {

    public long a() {
        if(something) {
            return quicklyCalculatedResult
        } else {
            return b() run on separate thread, with this one blocked
        }
    }

    public long b() {} //doStuffOnCurrentThread;

}

У меня есть полный набор тестов для b (), который выполняет тяжелую работу.К сожалению, я должен заставить уродливую мысль походить на () (устаревший код), и я не хочу копировать все тесты.Из метода б ().Кроме того, оба они должны быть общедоступными.

Я хочу проверить, что при определенных обстоятельствах a () вызывает b (), но я не могу этого сделать, поскольку протестированный класс не является фиктивным.Мне нужен способ убедиться, что метод был вызван для реального объекта, а не только для имитации.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Библиотеки Mockito и других библиотек Kotlin обеспечивают частичную проверку или аналогичную функциональность.Вы можете указать реальные методы для вызова, в то время как другие методы остаются заглушками:

Пример Java-мокито:

A classUnderTest = mock(A.class);
when(classUnderTest.a()).thenCallRealMethod();

classUnderTest.a();
verify(classUnderTest).b()

См. Mockito Документация о частичной имитации.Частичная имитация не приветствуется, потому что она не подходит для хорошего дизайна ООП, но в вашем случае она соответствует своему прямому назначению, которое заключается в тестировании сложного унаследованного кода.

Пример Kotlin с ванильным Mockito:

val classUnderTest = mock(A::class.java)
`when`(classUnderTest.a()).thenCallRealMethod()

classUnderTest.a()
verify(classUnderTest).b()

mockito-kotlin предоставляет расширения, позволяющие использовать mockito более идиоматическим образом.К сожалению, кажется, что нет способа сделать частичное издевательство идиоматическим способом kotlin, но это может быть достигнуто в mockito-kotlin следующим образом:

val classUnderTest = mock<A>()
doCallRealMethod().whenever(classUnderTest).a()

classUnderTest.a()
verify(classUnderTest).b()

MockK , идиоматическийБиблиотека насмешек kotlin, позволяет использовать эту функцию с помощью spys.После создания spy класса вы можете выбрать методы-заглушки:

val classUnderTest = spyk<A>()
every { classUnderTest.b() } returns 1L

classUnderTest.a()
verify { classUnderTest.b() }
0 голосов
/ 11 декабря 2018

Вы можете сделать A шпионом с @Spy или Mockito.spy().Это позволит вам вызывать и тестировать логику метода a(), а также заменять b() инвариантом.Это можно проиллюстрировать списком:

List list = new LinkedList();
List spy = Mockito.spy(list);

// Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");

// You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...