Вызов метода подсчета в модульных тестах - программирование

Вызов метода подсчета в модульных тестах

Каков наилучший способ подсчета вызовов метода в Unit Test. Предоставляет ли какая-либо инфраструктура тестирования?

4b9b3361

Ответ 1

Похоже, вы можете использовать методы типа .expects(1), которые обычно предоставляют фреймворки.

Используя mockito, если вы тестировали List и хотели проверить, что clear был вызван 3 раза, а add был вызван хотя бы один раз с помощью этого параметра, вы делаете следующее:

List mock = mock(List.class);        

someCodeThatInteractsWithMock();                 

verify(mock, times(3)).clear();
verify(mock, atLeastOnce()).add(anyObject());      

(Из http://code.google.com/p/mockito/wiki/MockitoVSEasyMock)

Ответ 2

Вы можете подсчитать количество вызовов метода с помощью интерфейса Ответ в Mockito.

ConnectionPool mockedConnectionPool = mock(ConnectionPool.class);

    final int[] counter = new int[1];

    when(mockedConnectionPool.getConnection()).then(new Answer<Connection>() {

        @Override
        public Connection answer(InvocationOnMock invocation) throws Throwable {
            counter[0]++;
            return conn;
        }

    }); 
    // some your code

    assertTrue(counter[0] == 1);

Ответ 3

В Mockito вы можете сделать что-то вроде этого:

YourService serviceMock = Mockito.mock(YourService.class);

// code using YourService

// details of all invocations including methods and arguments
Collection<Invocation> invocations = Mockito.mockingDetails(serviceMock).getInvocations();
// just a number of calls of any mock methods
int numberOfCalls = invocations.size();

Ответ 4

В зависимости от того, какие методы вы хотите подсчитать, вы можете создать тестовую конфигурацию с советом @Before, соответствующим вашему классу/пакету/методу:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MethodCounterAspect {

    private int counter = 0 // or inject the Counter object into this aspect

    @Pointcut( "execution( * com.sample.your.package.*.*(..) )" )
    public void methodsToCount() {}

    @Before("methodsToCount()")
    public void execute() throws Throwable {
        counter++; // or update the counter injected into this aspect..
    }

    // get the counter
}

Вы можете использовать vanilla AspectJ или Spring AOP через выше или конфигурацию XML, если вам будет легче.

Вы можете создать различные точки/аспект, если вам нужно.

Ответ 6

У вас есть несколько вариантов

1) Добавьте специальный код, который подсчитывает вызовы в функции. Он будет работать, но это не отличное решение.

2) После запуска модульных тестов проверьте покрытие кода. Большинство инструментов покрытия будут подсчитывать вызовы, но они действительно предназначены для последующей обработки.

3) Используйте профилировщик. Профайлер позволит вам подсчитать, сколько раз функция вызывается. Это очень ручной процесс, поэтому он не предназначен для модульного тестирования.

Лучшим решением было бы проверить, что вывод - это то, что вы ожидаете, а не проверка того, как он работает внутри.