Это может показаться довольно подробным вопросом о Easymock, но мне трудно найти сайт поддержки / форум / список рассылки для этой библиотеки.
Я сталкиваюсь с ошибкой при использовании метода captures()
, который, кажется, возвращает захваченные параметры не по порядку.
Вот упрощенная версия того, что я тестирую:
public class CaptureTest extends TestCase {
// interface we will be mocking
interface Processor {
void process(String x);
}
// class that uses the interface above which will receive the mock
class Component {
private Processor processor;
private String[] s = { "one", "two", "three", "four" };
Component(Processor processor) {
this.processor = processor;
}
public void doSomething() {
for (int i = 0; i < s.length; i++) {
processor.process(s[i]);
}
}
}
public void testCapture() {
//create the mock, wire it up
Processor mockProcessor = createMock(Processor.class);
Component component = new Component(mockProcessor);
//we're going to call the process method four times
//with different arguments, and we want to capture
//the value passed to the mock so we can assert against it later
Capture<String> cap1 = new Capture<String>();
Capture<String> cap2 = new Capture<String>();
Capture<String> cap3 = new Capture<String>();
Capture<String> cap4 = new Capture<String>();
mockProcessor.process(and(isA(String.class), capture(cap1)));
mockProcessor.process(and(isA(String.class), capture(cap2)));
mockProcessor.process(and(isA(String.class), capture(cap3)));
mockProcessor.process(and(isA(String.class), capture(cap4)));
replay(mockProcessor);
component.doSomething();
//check what values were passed to the mock
assertEquals("one", cap1.getValue());
assertEquals("two", cap2.getValue());
assertEquals("three", cap3.getValue());
assertEquals("four", cap4.getValue());
verify(mockProcessor);
}
}
(Обратите внимание, что это всего лишь упрощенный тестовый пример - я знаю, что могу указать точное значение аргументов, которые я ожидаю передать моему макету, но в моем реальном случае аргументы - это сложные объекты с несколькими полями, и я хочу захватить объект, чтобы можно было утверждать только некоторые из этих полей, не создавая заново весь объект в моем тестовом примере).
Когда я запускаю тест, он терпит неудачу в:
junit.framework.ComparisonFailure: ожидается: <[one]>, но было: <[four]>
Это означает, что параметр, который EasyMock записывает в cap1
, является не первым вызовом метода, а последним (поскольку значение four
). Я получаю те же результаты, если перевернуть декларации captures()
, т. Е. Использовать cap4
с первым вызовом метода и т. Д.
Похоже, что это может быть ошибкой в EasyMock - разные параметры, переданные одному и тому же методу в разных вызовах, похоже, не фиксируются правильно.
Кто-нибудь еще использует capture()
с EasyMock и имеет подобные проблемы? Есть ли простой обходной путь, о котором вы знаете, или другой способ, которым я могу зафиксировать параметры, передаваемые методам моего макета?
Обновление 1 : исправлен пример кода, показывающий, что я использую createMock
, а не createStrictMock
, но я получаю одинаковую ошибку с обоими (хотя фактическое значение того, что записано, меняется).