2015-02-11 1 views
1

Мне интересно, можно ли определить поведение в easyMock, что позволяет выполнять «промежуточные» вызовы метода.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'? Вы действительно не знаете, сколько раз это можно назвать в этом контексте? Неужели это будет больше, чем один раз? – mystarrocks

+0

Мой пример действительно упрощен, и, конечно, я могу подсчитать, сколько раз этот метод вызывается. Точка: я не хочу, чтобы модульный тест зависел от добавления/изменения или даже включения/отключения вывода журнала. Более общий: я хочу исключить некоторые методы из «строгого» порядка. – geronimo

ответ

1

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

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

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

+1

Спасибо, я не знал, что метод 'andStubReturn', это именно то, что мне нужно! Я также нашел это сообщение, чтобы объяснить разницу между этим методом и 'andReturn': http://stackoverflow.com/questions/3740376/easymock-andreturn-vs-andstubreturn – geronimo