程序中每个方法的JUnit测试方法

时间:2017-05-04 07:37:43

标签: java junit

我为以下程序编写了一个JUnit测试用例。

 public class Item {

    private int quantity;
    private int threshold;

    public int getQuantity(){
        return quantity;
    }

    public Item(int quantity){
        this.quantity= quantity;
        threshold = (int)(0.25* (float)quantity); //t=2
    }

    public int Add(int num){    
            return quantity= quantity+num;
    }

    public int Deduct(int num){
        if(num<threshold){
            quantity= quantity-num;
            return (quantity);
        }

        else{
            return -1;
        }
    }

    public String StockLevel(){
        return ((quantity<threshold) ? "under stock" : "over stock");
    }

}

JUnit Testcase

public class ItemJunit {
    @Test
    public void test(){

        Item i= new Item(8);
        assertEquals(12, i.Add(4));
        assertEquals(11, i.Deduct(1));  
    }

}

我向老师展示了答案,但他告诉我答案是正确的,我应该为程序中的每个方法编写一个测试方法。 我该怎么做?

3 个答案:

答案 0 :(得分:2)

UnitTest中的每个测试方法都应该验证正好一个关于被测单元行为的期望

这意味着您不仅需要为)中的每个 public 方法编写单独的测试方法,而且还需要编写测试方法每个单独的期望关于你的裁剪如何运作 此外,您(通常)每个测试方法只有一个assert

public class ItemJunit {
    @Test
    public void addingFourtoEightReturnsTwelve(){
        Item i= new Item(8);
        assertEquals(12, i.Add(4));
    }
    @Test
    public void addingOnetoMaxIntOverflows(){
        Item i= new Item(Integer.MAX_VALUE);
        assertEquals(Integer.MIN_VALUE, i.Add(1));
    }
    @Test
    public void subtractOneFromTwelveReturnsEleven(){
        Item i= new Item(12);
        assertEquals(11, i.Deduct(1));  
    }
}

原因是:

如果您只有一个具有多个断言的测试方法,则第一个失败的断言退出测试。这意味着在您的情况下:如果您的第一次检查assertEquals(12, i.Add(4));失败,则您的Deduce方法无法正常工作。

如果你有单独的测试方法,每个测试方法都有一个明确的期望作为测试方法的名称你可以通过失败的测试方法的名称来判断问题是什么。

答案 1 :(得分:0)

当您使用Eclipse IDE时,您可以在创建新的JUnit Testcase时选择“正在测试的类”。对于每个方法,Eclipse将创建一个@ Test-Method。

答案 2 :(得分:0)

您应该使用Item类中编写的所有方法来完全测试您的程序。我可以看到,你没有在程序中的任何位置使用StockLevel()和getQuantity()。此外,按名称使用私有字段不是一个好习惯。您应该生成getter和setter以提供完整的访问权限。 您的方法名称也不符合java规范。 java规范说,methos名称应该是camelCase。