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

Java 程序中每个方法的JUnit测试方法,java,junit,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)(

我为下面的程序编写了一个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");
    }

}
}

我给老师看了答案,但他告诉我答案部分正确,我应该为程序中的每个方法编写一个测试方法。
我该怎么做

UnitTest中的每种测试方法都应该验证被测单元行为的一个期望值

这意味着您不仅需要为被测类(cut)中的每个公共方法编写单独的测试方法,还需要为每个关于cut如何工作的单独期望编写测试方法。
而且(通常)每个测试方法只有一个
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))失败您没有任何信息表明
推断方法是否有效


如果您有单独的测试方法,每个方法都有一个断言,并且测试方法名称有一个明确的期望值,那么您可以通过失败测试方法的名称来判断问题所在。

当您使用Eclipse IDE时,您可以在创建新的JUnit测试用例时选择“测试中的类”。Eclipse将为每个方法创建一个@Test方法。

您应该使用在Item类中编写的所有方法来完全测试您的程序。正如我所看到的,在程序的任何地方都没有使用StockLevel()和getQuantity()。此外,按名称使用私有字段也不是一个好的做法。您应该生成getter和setter以提供完整的访问。
另外,您的方法名称不符合java规范。java规范规定method的名称应该是camelCase。

而不仅仅是
test()
,在您的测试类中创建两个方法:
testAdd
testdeletry
您应该为程序中的每个方法编写一个
@test
方法
public void testAdd()
add()
方法上测试OK、bad和edge情况,以及
public void testdecreate()
decreate()
方法上测试OK、bad和edge情况,例如@HuguesMoreau和一个用于
StockLevel()
。另外,将方法名称更改为以小写字符开头。顺便说一句,你考虑问老师这个问题吗?他们最清楚他们的反馈是什么意思。。。这就是他们在那里的目的。:)我喜欢这个答案,但我认为解释你为什么应该这样做会让它变得更好。@Rhayene谢谢你的评论,你喜欢我的修正案吗?是的,这个解释表明,我们这样做不仅是一个范例,而且有一个非常实际的原因,我喜欢:)
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));  
    }
}