我使用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的引用,为什么在断言之前答案不会成立?
提前致谢
答案 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.
}
就我个人而言,我正在成为许多测试的手写假货的粉丝 - 模拟非常适合交互测试(又名协议测试)但在这种情况下它看起来很棒就像一个简单的假装也可以做到......或者可能是混合物,它会伪造出简单的位(属性),但允许对需要交互测试的位进行模拟。