所以我想要一个包含10个易失性布尔值的数组,而不是一个包含10个布尔值的易失性数组。 有一个易失性数组引用可能甚至没有意义,如果我错了就纠正我。 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我一直在学习 Java,所以请告知在这种情况下异常抛出测试应该是什么样子? 我有以下赌博机 Class。 然后对其进行 2 次测试。 我真的不知道第二种方法(shouldThrowWhenNumbersOutOfRange)中的“整数”应该遵循什么。 您能否告知确切的语法?
public class GamblingMachine {
public int howManyWins(Set<Integer> userNumbers) throws InvalidNumbersException {
validateNumbers(userNumbers);
Set<Integer> computerNumbers = generateComputerNumbers();
int count = 0;
for (Integer number : userNumbers) {
if (computerNumbers.contains(number)) {
count++;
}
}
return count;
}
private void validateNumbers(Set<Integer> numbers) throws InvalidNumbersException {
if (numbers.size() != 6) {
throw new InvalidNumbersException();
}
if (numbers.stream().anyMatch(number -> number < 1 || number > 49)) { //anyMatch-function to check whether any element in list satisfy given condition
throw new InvalidNumbersException();
}
}
private Set<Integer> generateComputerNumbers() {
Set<Integer> numbers = new HashSet<>();
Random generator = new Random();
while(numbers.size() < 6) {
numbers.add(generator.nextInt(49) + 1);
}
return numbers;
}
}
private GamblingMachine machine = new GamblingMachine();
@ParameterizedTest
@NullAndEmptySource
public void shouldThrowWhenNumbersEmpty(Set<Integer> numbers) throws InvalidNumbersException {
Assertions.assertThrows(NumberFormatException.class, () -> {
Integer.parseInt(" ");
});
}
@ParameterizedTest
@CsvFileSource(resources ="/numbersOutOfRange.cvs", numLinesToSkip = 1)
public void shouldThrowWhenNumbersOutOfRange(Set<Integer> numbers) throws InvalidNumbersException {
Assertions.assertThrows(NumberFormatException.class, () -> {
Integer. //how code should look like here?
});
}
测试的重点是,你知道,测试一些东西。 你的shouldThrowWhenNumbersEmpty
测试没有这样做(好吧,它测试Integer.parseInt(" ")
抛出一些东西。它当然会。你......不必测试核心库)。
换句话说,您的赌博机测试需要从您的 GamblingMachine class 调用一些东西。 这个想法是测试 GamblingMachine。 不测试Integer.parseInt
。
这也是一个奇怪的测试:为什么在大火中是shouldThrowWhenNumbersEmpty
参数化? 我假设该测试的重点是:“确保赌博机在传递一组空数字时按设计工作,特别是在设计中声明如果这样做会引发InvalidNumbersException
的部分”。
这是通过以下方式完成的:
@Test
public void shouldThrowWhenNumbersEmpty() {
Assertions.assertThrows(InvalidNumbersException.class, () -> {
Set<Integer> empty = Set.of();
machine.howManyWins(empty);
});
}
参数化测试是一个相当奇特的概念。 您的测试设置似乎陷入了陷阱:您似乎设置了重复您的赌博机 class 中已有的所有逻辑,然后将此逻辑应用于传入(参数化)数据,找出您的赌博机应该做,然后仔细检查它的工作。
这不是您应该编写测试的方式。 测试侧重于特定结果。 参数化测试是有意义的,但前提是您必须为任何给定输入做的事情大致相同。 例如:
您有一个 csv 文件,其中包含一堆行,每行都有 6 个卷 + 正确答案。 您的参数化测试对每一行的处理方式相同:使用 6 个滚动作为输入调用howManyWins
,然后检查howManyWins
返回预期值。
您有一个 csv 文件,其中包含一堆行,每行有 6 个卷。 您的参数化测试将计算出正确的掷骰结果,然后调用赌博机,并检查赌博机给出的答案是否与您计算的结果相同。
这很糟糕:您只是在重复代码。 这也意味着您的测试代码本身所做的不仅仅是最基本的(它正在执行一堆业务逻辑),因此提出了一个问题:那么谁来测试您的测试呢?
您的两种测试方法似乎都不应该被参数化,除非 csv 也包含结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.