假设我想为一个新的,未经测试的数据结构BlackBox编写一些JUnit测试。它有一个类似于Map的界面,但没有办法告诉它里面发生了什么:
blackBox.get(key);
blackBox.put(key, value);
如何在以下两种情况下正确地对.get
和.put
进行单元测试?我无法弄清楚如何独立测试这两个。
我知道如果我可以访问源代码,我可以执行以下操作:
Whitebox.setInternalState(blackBox, "storage", storageObject);
assertEquals(blackBox.get("key"), expectedAnswer");
我可以做相反的事情来测试.put()
。问题是那些测试依赖于类的实现。
那么如何在不了解或依赖类的实现细节的情况下单独测试.get
和.put
?
答案 0 :(得分:1)
我无法弄清楚如何独立测试这两个。
你为什么要这样做?合同是否表明他们是独立的?我不这么认为。我猜合同说:
get
将返回null / throw异常。put
时,你可以get
。 get
你没有put
。put
多次使用相同的密钥时,您将get
最新的值。等等。你可以测试每个不变量。当你使用Whitebox
时,你开始测试实现细节,而不是合同,这使得重构(例如使用更快的实现)更加困难