Как я могу модульно протестировать метод с несколькими внутренними вызовами в класс, который я хочу издеваться с помощью EasyMock - PullRequest
1 голос
/ 05 мая 2019

Я хотел бы провести модульное тестирование метода с несколькими внутренними вызовами в класс, который я хочу смоделировать, используя EasyMock.

Тестовый метод фактически запускается 5 раз и вызывает проверенный метод.

Во время каждого цикла я буду создавать несколько объектов одного и того же класса (скажем, класса A). Закрытый метод вызовет метод фиктивного объекта, который принимает экземпляр класса А., оценивает его и возвращает результат.

В конце публичный метод вернет список результатов.

Я попробовал стандарт EasyMock.expect(MockClass.method(A)).andReturn(), но он не работает, так как нет реализации equals() для класса A:

// this is the method example I am trying to test
public methodToTest(){
     // some logic
      privateMethodToTest(x);
     // some logic 
}
private List<B> privateMethodToTest(int x){
  List<B> list = new ArrayList<>();
  List<A> all = getObjects(x); //getObjects private method
  for (A a:all){
    list.add(objectToMock.methodToMock(a));
    return list;
  }

Вот как я бы хотел, чтобы это работало:

EasyMock.createMock(ObjectToMock.class);
EasyMock.expect(ObjectToMock.methodToMock(A)/* when A.getValue() == 1 */.andReturn("B object number 1")
EasyMock.expect(ObjectToMock.methodToMock(A)/* when A.getValue() == 2 */.andReturn("B object number 2")
//... and so on 
//object of class A does not implement equals()

Я не уверен, как это сделать, и мне не удалось найти аналогичный пример или ответить на мой вопрос.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Тебе нужен другой матчер. По умолчанию EasyMock действительно будет соответствовать, используя equals. Но ты не можешь этого сделать. Ваш основной выбор:

  1. Тебе нет дела до точного соответствия

Если тебе кажется, что это проще всего. Это значит делать:

expect(objectToMock.methodToMock(anyObject()).andReturn("B object number 1");
expect(objectToMock.methodToMock(anyObject()).andReturn("B object number 2");
  1. Используйте компаратор

Согласно вашему комментарию, вы можете предпочесть это

expect(mock.methodToTest(EasyMock.cmp(new A(1), Comparator.comparingInt(A::getValue), LogicalOperator.EQUAL))).andReturn(1);

Единственная проблема в том, что вам нужно A с правильным значением для сравнения.

  1. Чтобы иметь упрощенную версию, вы можете использовать свой собственный сопоставитель

Ожидание с использованием пользовательского сопоставления, приведенного ниже.

expect(mock.methodToTest(cmp(0))).andReturn(3);

public static <T> T cmp(int value) {
    reportMatcher(new IArgumentMatcher() {
        @Override
        public boolean matches(Object argument) {
            return value == ((A) argument).getValue();
        }

        @Override
        public void appendTo(StringBuffer buffer) {
            buffer.append("A.value=").append(value);
        }
    });
    return null;
}
0 голосов
/ 06 мая 2019

При тестировании модуля мы проверяем общедоступное наблюдаемое поведение тестируемого кода, то есть возвращаемые значения и связь с зависимостями .

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

...