EasyMock: объединить промежуточные anyTimes со строгим макетом

1

Мне интересно, можно ли определить поведение в easyMock, что позволяет выполнять "промежуточные" вызовы методов.

Предположим, я хочу проверить поведение метода doSomething в этом классе:

class MyObject {
    MyOtherObject inner; // init as constructor param...

    void doSomething() {
        inner.call1();
        inner.call2();
    }

    public String toString() {
        return "MyObject{" + inner.getName() + "}";
    }
}

У меня был этот тестовый код:

MyOtherObject mocked = EasyMock.createStrictMock(MyOtherObject.class);
MyObject obj = new MyObject(myOtherObject);

// methods need to be called in this order
EasyMock.expect(mocked.call1()).once();
EasyMock.expect(mocked.call2()).once();

obj.doSomething();

Когда я изменяю реализацию MyObject.doSomething() для добавления журнала с помощью метода toString(), мои тесты терпят неудачу, потому что я не добавлял ожидания для MyOtherObject.getName().

Так как мне нужен строгий макет (с проверкой порядка методов), просто добавление этого не будет работать: EasyMock.expect(mocked.getName()).andReturn("blahblah").anyTimes().

Есть ли элегантный способ решить эту проблему? На данный момент я добавил этот оператор anyTimes() перед каждым "реальным" ожиданием, но он делает мой тест нечитаемым и трудноподдерживаемым.

Или мне нужно переключиться на другую тестовую среду?

  • 0
    Может быть, ваш пример слишком прост, чтобы понять реальную проблему здесь, но почему у вас нет дескриптора метода getName ? Вы действительно не знаете, сколько раз это можно назвать в этом контексте? Это действительно будет больше, чем один раз?
  • 0
    Мой пример действительно упрощен, и, конечно, я могу подсчитать, сколько раз вызывается этот метод. Дело в том, что я не хочу, чтобы модульный тест зависел от добавления / изменения или даже включения / отключения вывода журнала. Более общий: я хочу исключить некоторые методы из «строгого» порядка.
Теги:
unit-testing
easymock

1 ответ

1
Лучший ответ

Если вам не нужен вызов метода, например, ведение журнала, вы можете исключить его из любой проверки с помощью заглушки. Так:

EasyMock.expect(mocked.getName()).andStubReturn("blah");

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

  • 1
    Спасибо, я не знал, что метод andStubReturn , это именно то, что мне нужно! Я также нашел этот пост, чтобы объяснить разницу между этим методом и andReturn : stackoverflow.com/questions/3740376/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню