嘲笑没有保存状态

时间:2011-08-30 18:57:36

标签: java testing mocking easymock

我使用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类型的私有成员,其中设置了mock的引用,为什么在断言之前答案不会成立?

提前致谢

1 个答案:

答案 0 :(得分:2)

我刚刚注意到你断言同样的模拟被返回。你也永远不会调用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.
}

就我个人而言,我正在成为许多测试的手写假货的粉丝 - 模拟非常适合交互测试(又名协议测试)但在这种情况下它看起来很棒就像一个简单的假装也可以做到......或者可能是混合物,它会伪造出简单的位(属性),但允许对需要交互测试的位进行模拟。