Мне интересно, можно ли определить поведение в 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() перед каждым "реальным" ожиданием, но он делает мой тест нечитаемым и трудноподдерживаемым.
Или мне нужно переключиться на другую тестовую среду?
Если вам не нужен вызов метода, например, ведение журнала, вы можете исключить его из любой проверки с помощью заглушки. Так:
EasyMock.expect(mocked.getName()).andStubReturn("blah");
Это не позволит вашему тесту сломаться, вернув значение, но не будет зависеть от какой-либо насмешливой проверки, включая строгий макетный заказ.
andStubReturn
, это именно то, что мне нужно! Я также нашел этот пост, чтобы объяснить разницу между этим методом и andReturn
: stackoverflow.com/questions/3740376/…
getName
? Вы действительно не знаете, сколько раз это можно назвать в этом контексте? Это действительно будет больше, чем один раз?