【发布时间】:2016-08-27 06:13:42
【问题描述】:
我知道,如果我想模拟一个方法并根据其输入为其分配特定行为,我可以使用 MockUps API 来完成:
public class DuplicationTest {
static class Duplicator {
public String duplicate(String str) { return null; }
}
@Test
public void verifySameStringReturnedWithMockupsAPI() throws Exception {
new MockUp<Duplicator>() {
@Mock public String duplicate(String str) { return str; }
};
Duplicator dup = new Duplicator();
assertEquals("test", dup.duplicate("test"));
}
}
此测试通过。
但是,有时我没有使用 MockUps API 的奢侈(例如,在模拟静态类时),因此我只能使用 Expectations API:
@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
new Expectations() {{
dup.duplicate(anyString); result = anyString;
}};
assertEquals("test", dup.duplicate("test"));
}
这显然失败了。对dup.duplicate("test") 的调用返回一个空的String(可能是某种默认值)。有什么办法吗?
【问题讨论】:
-
你不能改变行为而不模拟它。您的第一个示例完全是多余的,只是示例代码吗?
-
是的,这只是示例代码,但为什么它是多余的?真正的(假的)实现返回 null
-
因为您没有测试任何生产代码。您基本上只是在测试您是否正确地模拟了它。无论您对生产代码进行什么更改,它都不会失败。
-
是的,你在这件事上是对的,但这只是为了证明一点。 10x 用于清除它
-
A
MockUp也可以与static嵌套类一起使用,但也许你的意思是别的。使用Expectations,可以将返回接收到的参数的Delegate对象分配给result。因此,在这种情况下,两个 API 都可以做对方可以做的任何事情。
标签: java unit-testing junit jmockit