Издеваться не спасая государство - PullRequest
1 голос
/ 30 августа 2011

Я занимаюсь модульным тестированием с easymock, и результат не задан в объекте ответа. Макет объекта передается субъекту тестирования, и после обработки возвращается та же ссылка на макет объекта, но он не содержит набора результатов.

Код должен сделать картинку более четкой

@Test
public void test() {
DomainInterface mock = EasyMock.create("mock", DomainInterface.class);
Subject subject = new Subject();
subject.setDomainInterface(mock);

final DomainInterface domain = subject.process();

assertEquals("Not the same instance", mock, domain);

final String expected = "VALID";
final String answer = domain.getAnswer();

assertEquals("Not the expected answer", expected, answer);
}

Subject.process выполняет пару проверок, а затем устанавливает «VALID» для ответа, но выполнение завершается неудачно с сообщением об ошибке подтверждения

java.lang.AssertionError: Not the expected answer expected:<VALID> but was:<null>

Объект субъекта имеет закрытый член типа DomainInterface, в котором установлена ​​ссылка на макет. Почему ответ не будет сохраняться до утверждения?

Заранее спасибо

1 Ответ

2 голосов
/ 30 августа 2011

Я только что заметил, что вы утверждаете, что возвращается тот же макет . Вы также никогда не звоните replay(), чтобы перевести макет в режим воспроизведения - если бы вы это сделали, он бы выдал исключение, как только Subject попытается вызвать какие-либо методы для него.

Полагаю, вы ожидаете, что макет запомнит вызов setAnswer и ответит с тем же результатом, когда вызывается getAnswer, но насмешка не работает таким образом. Вы, вероятно, ожидаете вызова setAnswer("VALID"). Примерно так:

public void test() {
    DomainInterface mock = EasyMock.create("mock", DomainInterface.class);

    // Expect that the subject will call setAnswer with an argument of "VALID"
    mock.setAnswer("VALID");

    EasyMock.replay();

    Subject subject = new Subject();
    subject.setDomainInterface(mock);

    DomainInterface domain = subject.process();    
    assertEquals("Not the same instance", mock, domain);

    // No need to assert the result of calling getAnswer - we've already asserted
    // that setAnswer will be called.
}

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

...