【发布时间】:2014-05-31 07:42:24
【问题描述】:
考虑以下类:
public class Deck {
private final Queue<Card> queue = new LinkedList<>();
public Deck() { }
public Deck(final Collection<Card> cards) {
Objects.requireNonNull(cards);
queue.addAll(cards);
}
public void add(final Card card) {
Objects.requireNonNull(card);
queue.add(card);
}
public void addAll(final Collection<Card> cards) {
Objects.requireNonNull(cards);
queue.addAll(cards);
}
public void shuffle() {
Collections.shuffle((List<Card>)queue);
}
public Card take() {
return queue.remove();
}
}
如何对shuffle() 方法进行单元测试?我正在使用 JUnit 4 进行测试。
我有以下选择:
- 测试
shuffle()看看它不会产生异常。 - 测试
shuffle()并检查牌组是否真的被洗牌了。
选项2的示例伪代码:
while notShuffled
create new Deck
take cards and check if they are shuffled
这里唯一的罪魁祸首是,在执行为选项 2(也继承了选项 1)编写的测试时,如果改组没有按预期工作,那么代码执行将永远不会停止。
我将如何解决这个问题?是否可以限制 JUnit 测试的执行时间?
【问题讨论】:
-
" 那么代码执行将永远不会停止。"
-
我认为您没有考虑的另一个问题是 shuffle 方法是否保持列表的顺序相同。我想这取决于您对 shuffle 方法的期望。至于永远不会完成的方法,这在理论上是任何被测方法都存在的问题。我不确定您是否需要明确担心这一点。
-
@fge 现在添加了伪代码,没想到还不清楚。
-
@StealthRabbi(在编辑中澄清)我正在考虑 my
Deck.shuffle方法保持列表相同,但我不考虑Collections.shuffle实现可能被打破。 -
@Vakh 你的回答完全有效,IMO。想取消删除以收到我的支持吗?
标签: java unit-testing junit