Java 程序中每个方法的JUnit测试方法
我为下面的程序编写了一个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)(
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));
}
}