繁体   English   中英

如何在一组值上正确使用 assertThrows?

How to use correctly assertThrows on set of values?

提示:本站收集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?
        });

    }
1 个回复

测试的重点是,你知道,测试一些东西。 你的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 也包含结果。

2 找不到:值assertThrows

我有以下测试课: 使用此测试方法: 我收到此错误: 我从这里http://doc.scalatest.org/3.0.0/#org.scalatest.FunSuite查看了ScalaTest文档,类似于我的代码似乎正常工作。 怎么了 ...

3 如何在C#中使用一组枚举值?

假设我有一个枚举 : 我想声明一个由这些枚举类型组成的“集合” 在其他语言中,您将声明: 然后我可以使用 C#有Flags的概念,伪代码: 问题不是真正的代码 - Flags没有指示编译器创建一组标志。 在一种情况下,类型应该只允许一个值( Di ...

4 XQuery-如何在一组值上使用eq(=)

我想知道如何查询一种特定的语言,这是一个相关的XML代码段: 我尝试过: 但只有在“德语”是“ lname”中唯一的语言的情况下,我才得到结果。 我怀疑这是由于XML文档不正确(XQuisitor没有有关语法的警告),还是因为“ =”号只能将一个确切的字符串与另一个字符串进行比 ...

5 如何使用assertThrows测试异常

我有一个名为“ foo”的函数,该函数生成字符串的ArrayList。 foo始终返回大小为2的非null数组。当我尝试到达超出范围的元素时,应获取“ IndexOutOfBounds”异常。 测试方法有两种变体。 第二个失败,而第一个正常。 您认为是什么导致第二个失败? 我试过使 ...

6 如何使用linq将正确的字段归为一组并求和?

我在此结构中有一个对象列表(债务人) 看起来像 我想做的是列出每个债务人的欠款总额 例如(请注意,下面的总额并不准确,我刚刚将它们补足了,但需要将上述总额加起来) 我到目前为止所拥有的是 这实际上给了我正确的金额,如下所示,但我也不知道该如何获得债务人的名字 ...

8 使用猪计算一组中的不同值

一般而言,我的问题是我想对数据进行分组,然后计算字段的uniq值。 具体来说,对于以下数据,我想按“类别”和“年份”分组,然后计算“食物”的uniq值。 据我所知,这只是挑选值并使用一些简洁的Pig日期函数: 别名“ c”的输出为: 最后我要: 我已经看到了一些 ...

9 如何使用 jQuery 对一组元素的值求和?

如何使用 jQuery 对一组元素的值求和? 当我使用console.log并且浏览器显示结果时,它是来自div元素的所有值的总和。 如何在它们具有相同class的条件下对我的值求和? let sumPartOne = 0; let sumPartTwo = 0; let sumP ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM