Java 单元测试返回数组最小值的方法

Java 单元测试返回数组最小值的方法,java,arrays,unit-testing,automated-tests,Java,Arrays,Unit Testing,Automated Tests,我有一个理论问题。给定一种方法: public int findSmallestArrayValue(int[] values){ int smallest = values[0]; for (int count = 0; count < values.length; count++){ if(values[count] < smallest){ smallest = values[count]; }

我有一个理论问题。给定一种方法:

public int findSmallestArrayValue(int[] values){

    int smallest = values[0];

    for (int count = 0; count < values.length; count++){

        if(values[count] < smallest){
            smallest = values[count];
        }
    }

    return smallest;
}
现在我问自己,还有什么有用/可能的?例如,我提出:

    assertEquals(array.findSmallestArrayValue(new int[]{5,11,3,6,8}),3);
    assertEquals(array.findSmallestArrayValue(new int[]{5,5,5,5,5}),5);
    assertEquals(array.findSmallestArrayValue(new int[]{-1,2,3,4,5}),-1);
  • 大于int的值,但Java不允许我这样做
  • 空数组,怎么做
  • 用比int能接受的更多的值填充int数组

特别是什么是真正有用的,什么不是?你觉得怎么样?

到目前为止,你目前的测试想法很好。这是额外的测试,我会考虑添加

@Test(expected = IllegalArgumentException.class)
public void emptyArrayIsNotAcceptedArgument() {
    array.findSmallestArrayValue(new int[]{});
}

@Test(expected = IllegalArgumentException.class)
public void nullArrayIsNotAcceptedArgument() {
    array.findSmallestArrayValue(null);
}

@Test
public void lastValueIsSmallest() {
    assertEquals(array.findSmallestArrayValue(new int[]{0,-1}),-1);
}
至于你的想法:

  • 大于int的值,但Java不允许我这样做?
    • Java的编译器只允许向该方法传递int[],所以不需要测试
  • 用比int能接受的更多的值填充int数组?
    • Java数组的大小不能大于max int值。无论如何,这并不会给您的测试带来太多好处

想到的一些情况:

  • (您的建议)检查空数组
    • values.length>0
  • 检查空数组
    • 值!=空

这些情况是您将在方法中处理的,并确保该方法输出正确的错误消息或您写入的异常。

您始终希望测试边界条件。因此,您需要测试:

  • 空的
  • 空的
  • 一个
  • 几个
  • 全部否定
  • 正面和负面的混合
你有一些,其他人提供了其他的。记住,进行这样的测试:

assertEquals(array.findSmallestArrayValue(new int[]{5,11,3,6,8}),3);
这样的测试没有什么价值:

assertEquals(array.findSmallestArrayValue(new int[]{5,11,6,8}),5);

现在,当您确实遇到方法中的缺陷时,您将希望编写一个测试来公开该缺陷的条件。

太棒了!谢谢你的回答,我很感激!我认为良好的组合是关键:

public class ArrayValuesTest {

ArrayValues array = new ArrayValues();

@Test
public void returnsSmallestValue() {

    assertEquals(array.findSmallestArrayValue(new int[]{5,11,3,6,8}),3);
    assertEquals(array.findSmallestArrayValue(new int[]{5}),5);
    assertEquals(array.findSmallestArrayValue(new int[]{0}),0);
    assertEquals(array.findSmallestArrayValue(new int[]{-5,-8,-3,-6,-11}),-11);
    assertEquals(array.findSmallestArrayValue(new int[]{-20,11,-3,6,-8}),-20);

}

@Test(expected = ArrayIndexOutOfBoundsException.class)
public void emptyArrayIsNotAcceptedArgument() {
    array.findSmallestArrayValue(new int[]{});
}

@Test(expected = NullPointerException.class)
public void nullArrayIsNotAcceptedArgument() {
    array.findSmallestArrayValue(null);
}
}


您认为在第一个测试方法中包含多个断言而不是使用单独的测试方法是不好的做法吗?

对于空数组,您可以使用
newint[0]
。我还将测试空数组的可能性。您没有正确处理空数组(或
null
one):它会引发异常。请记住,您不能测试所有情况,因此,您应该测试一些正常情况和限制情况(例如空数组)。但是,过度测试代码弊大于利,特别是对于直接函数,您的意思是什么:assertNull(array.findsmalestarayvalue(newint[]{}))?面试问题,对吧?是的。但是面试结束了,我只是想知道一般怎么做;-)嗨,编译器告诉我它应该是ArrayIndexOutOfBoundsException和NullPointerException,用它们试过之后,它就工作了…当然。。。但我建议您修改方法,在这些情况下抛出一个IllegalArgumentException。当前实现引发的异常实际上不适合输入。Hmm,例如:
if(values==null){throw new IllegalArgumentException(“数组为null”);}否则if(values.length==0){throw new IllegalArgumentException(“数组为空”);}
?我仍然得到NullPointerException…我很愚蠢,设置数组0,然后跳到if/else;-)对不起,我没有及时回复。是的,问题是您在检查数组是否为null之前使用了该数组。始终首先检查最重要的先决条件:)。