【发布时间】:2017-05-17 13:51:43
【问题描述】:
假设我有一个以链表样式实现堆栈的类:
public class Stack {
private StackNode base;
public void push(Object item) {
if (base == null) {base = new StackNode(item);}
// remaining implementation not shown
}
}
还有一个 JUnit 测试类:
public class TestStack {
@Test
public void testPush() {
Stack st = new Stack();
st.push(new Integer(3));
assertEquals((Integer)st.base.getContents(), new Integer(3)); //Error!
// other test cases not shown
}
}
我的问题是:解决测试类对base 的访问权限问题的最佳做法是什么?
我知道这个question 讨论了制作访问器,我知道我也可以将我的Stack 和TestStack 代码放入一个包中并将base 字段包私有。
我想知道最好的做法是什么。我知道我不应该在push 的单元测试中使用pop,反之亦然,因为这结合了这些单元测试。
如果我不希望客户端代码访问该字段,我认为创建(公共)访问器是不好的做法,为字段(或字段本身)包创建访问器的正确调用也是如此-私人?
另一个信息丰富的question 讨论了私有方法的选项,但这是关于公共方法的,为了测试它,我需要访问一个私有字段,所以许多语句“如果你需要访问私有方法/类,你做错了”似乎不适用于这里。
【问题讨论】:
-
如果您只是在读取该值,为什么不简单地为此实现一个 getter?
-
为什么在任何情况下都需要测试它?如果是堆栈,是否可以调用公共 pop() 方法来检查它是否正确保存了值?
-
测试行为 - 而不是实现。内部胆量应该无关紧要。您应该能够根据需要更改实现。只要公共方法的签名没有改变,单元测试就不需要改变。
-
仍然是一个很好的新手问题,因为您实际上坐下来进行了一些先前的研究。我对此的投票......玩得开心练习投票......并且不要忘记在某个时候接受最有帮助的答案。
标签: java unit-testing junit