不包含4级-Java 公共类学位{ 公共学位(名单第二年、名单第三年){ 如果(年份2.size()!=4 | |年份3.size()!=4){ 抛出新的IllegalArgumentException(); } }

不包含4级-Java 公共类学位{ 公共学位(名单第二年、名单第三年){ 如果(年份2.size()!=4 | |年份3.size()!=4){ 抛出新的IllegalArgumentException(); } },java,Java,我有一个“不包含4级”的语句来创建Junit测试。有没有更好的方法来改进这个语句(让我的知识在将来帮助我) @Test(预期=IllegalArgumentException.class) 公共无效不包含等级(){ 列表年份2=新的ArrayList(); 第2年.增加(新职系(1)); 第2年增加(新的第(2)级); 第2年.增加(新职系(3)); 列表年份3=新的ArrayList(); 第3年.增加(新职系(1)); 第3年.增加(新职系(2)); 第3年增加(新的第(3)级); 新学位(

我有一个“不包含4级”的语句来创建Junit测试。有没有更好的方法来改进这个语句(让我的知识在将来帮助我)

@Test(预期=IllegalArgumentException.class)
公共无效不包含等级(){
列表年份2=新的ArrayList();
第2年.增加(新职系(1));
第2年增加(新的第(2)级);
第2年.增加(新职系(3));
列表年份3=新的ArrayList();
第3年.增加(新职系(1));
第3年.增加(新职系(2));
第3年增加(新的第(3)级);
新学位(二年级、三年级);
}

我的Junit测试的示例

您的测试将通过,因为异常将被抛出

但是,您犯了一个常见的错误,即尝试在一个测试中测试多个问题。您确实需要四个测试才能实现全面覆盖

  • 快乐路径,在这里您传递两个有效参数并返回一个实例,而不是异常

  • 传递一个坏值和一个好值,然后得到一个异常

  • 传递一个好值和一个坏值,然后得到一个异常

  • 您传入两个错误值并得到一个异常

  • 延迟添加:如果if语句包含OR运算符,则无法在工具中获得100%的覆盖率。这是因为覆盖率工具希望检查两个条件是否为false。但是,OR停止检查第一个false,因此不会检查第二个条件


    要达到100%覆盖率,请将if与或拆分为两个if。代码执行是相同的,但覆盖工具将看到所有代码都已执行。

    您的测试将通过,因为将引发异常

    但是,您犯了一个常见的错误,即尝试在一个测试中测试多个问题。您确实需要四个测试才能实现全面覆盖

  • 快乐路径,在这里您传递两个有效参数并返回一个实例,而不是异常

  • 传递一个坏值和一个好值,然后得到一个异常

  • 传递一个好值和一个坏值,然后得到一个异常

  • 您传入两个错误值并得到一个异常

  • 延迟添加:如果if语句包含OR运算符,则无法在工具中获得100%的覆盖率。这是因为覆盖率工具希望检查两个条件是否为false。但是,OR停止检查第一个false,因此不会检查第二个条件


    要达到100%覆盖率,请将if与或拆分为两个if。代码执行是相同的,但覆盖工具将看到所有代码都已执行。

    <4
    。您的测试将通过
    5
    ,并且
    5
    包含
    4
    。如果我更改为==3,是否会有所不同?您的测试仍将通过,但只有在一个或两个数组都已通过的情况下正好是三个元素而不是“不是4”换句话说,它缩小了测试的范围。是否有其他方法编写if语句?
    <4
    。您的测试将通过
    5
    ,并且
    5
    包含
    4
    。如果我改为==3,会有区别吗?您的测试仍然会通过,但前提是一个或两个数组正好有三个元素而不是“非4”换句话说,它缩小了测试的范围。有没有其他方法来编写if语句?第一种方法是什么?不确定,我通过junit测试获得了3/4的分支覆盖率快乐的路径意味着一切都进行得很顺利。既然你提到了这一点,你不能用in或condition获得100%的覆盖率。那是因为第二种方法如果第一个条件为false,则不会对条件进行评估。因此,测试4.不会从覆盖率工具“获得积分”。当我真的想要100%的覆盖率时,我会使用OR将if分成两个if.if(year2.size()==3){if(year3.size()==3){//不包含4级抛出新的IllegalArgumentException();}如果我像这样改变我的if语句,使用你推荐的那些测试,它会通过4/4覆盖率吗?第一个是什么?不确定,我通过junit测试获得了3/4分支覆盖率。快乐的道路意味着一切都很顺利。现在你提到了它,你不能通过in或condition获得100%的覆盖率。这是因为第二个co如果第一个选项为false,则不会对条件进行评估。因此,测试4.不会从覆盖率工具“获得积分”。当我真的想要100%的覆盖率时,我会使用OR将if分成两个if.if(year2.size()==3){if(year3.size()==3){//不包含4级抛出新的IllegalArgumentException();}如果我像这样更改我的if语句,使用您推荐的测试,它会通过4/4覆盖率吗?
    public class Degree {
    
    public Degree(List<Grade> year2, List<Grade> year3) {
    
        if (year2.size() != 4 || year3.size() != 4) {
            throw new IllegalArgumentException();
        }   
    }
    
      @Test(expected = IllegalArgumentException.class)
      public void donotcontaingrade() {
        List<Grade> year2 = new ArrayList<>();
        year2.add(new Grade(1));
        year2.add(new Grade(2));
        year2.add(new Grade(3));
    
        List<Grade> year3 = new ArrayList<>();
        year3.add(new Grade(1));
        year3.add(new Grade(2));
        year3.add(new Grade(3));
        new Degree(year2, year3);
    }