Java/JUnit—测试预定义多项式的断言错误
我有一个术语类来定义多项式:Java/JUnit—测试预定义多项式的断言错误,java,junit,polynomial-math,Java,Junit,Polynomial Math,我有一个术语类来定义多项式: public class Term { final private int coef; final private int expo; private static Term zero, unit; static { try { zero = new Term(0, 0); // the number zero unit = new Term(
public class Term
{
final private int coef;
final private int expo;
private static Term zero, unit;
static
{
try
{
zero = new Term(0, 0); // the number zero
unit = new Term(1, 0); // the number one
}
catch (Exception e)
{
// constructor will not throw an exception here anyway
}
}
/**
*
* @param c
* The coefficient of the new term
* @param e
* The exponent of the new term (must be non-negative)
* @throws NegativeExponent
*/
public Term(int c, int e) throws NegativeExponent
{
if (e < 0)
throw new NegativeExponent();
coef = c;
expo = (coef == 0) ? 1 : e;
}
final public static Term Zero = zero;
final public static Term Unit = unit;
public boolean isConstant()
{
boolean isConst = false;
if (this.expo == 0)
{
isConst = true;
}
return isConst;
}
}
测试2和4通过了,但测试1和3失败了,我无法解释为什么“零”将多项式定义为(0,0),而另一个定义为(0,5)。根据我的想法,第一个测试应该给出一个绿色的记号,第三个测试应该给出一个红色的十字,因为它的指数是5
有什么想法吗?请查看您的构造函数:
public Term(int c, int e) throws NegativeExponent{
if (e < 0) throw new NegativeExponent();
coef = c;
expo = (coef == 0) ? 1 : e;
}
编辑:要反向修复代码以使测试用例通过,我认为您可以如下更新构造函数:
public Term(int c, int e) throws NegativeExponent{
if (e < 0) throw new NegativeExponent();
coef = c;
expo = (c == 0 && e != 0) ? 0 : e;
}
public-Term(int c,int e)抛出否定指数{
如果(e<0)抛出新的否定指数();
coef=c;
世博会=(c==0&&e!=0)?0:e;
}
在这里,我更新了构造函数,将
expo
设置为0,如果coef
为0,因为任何coef 0的expo都是无关紧要的。请查看您的构造函数:
public Term(int c, int e) throws NegativeExponent{
if (e < 0) throw new NegativeExponent();
coef = c;
expo = (coef == 0) ? 1 : e;
}
编辑:要反向修复代码以使测试用例通过,我认为您可以如下更新构造函数:
public Term(int c, int e) throws NegativeExponent{
if (e < 0) throw new NegativeExponent();
coef = c;
expo = (c == 0 && e != 0) ? 0 : e;
}
public-Term(int c,int e)抛出否定指数{
如果(e<0)抛出新的否定指数();
coef=c;
世博会=(c==0&&e!=0)?0:e;
}
在这里,我更新了构造函数,将
expo
设置为0,如果coef
为0,因为coef 0的任何expo都是无关紧要的。Yogendra讲述了第一次测试失败的原因。您的const3()失败了(至少对我来说),因为新的术语(0,5)有一个5的expo,它被替换为1 b/c的coef,但1仍然不是0,所以新的术语(0,5)不是常量
不是你问的,但我也会给你一些关于未来的通用Java指针
1) 对静态常量使用所有大写
public static final Term ZERO = new Term(0, 0);
public static final Term UNIT = new Term(1, 0);
这只是Java社区所期望的一种约定
2) 为测试用例指定有意义的名称。测试用例的一个强大用途是,它们可以同时作为假设的文档。不要使用const1()这样的描述性名称,比如zeroShouldBeAConstant()。这会告诉下一个查看代码的人,在这个系统中零应该被视为常量
3)每当返回布尔变量时,只考虑返回语句。将下面的函数与您的函数进行比较,并告诉我哪一个更具可读性:
public boolean isConstant()
{
return expo == 0;
}
它的代码更少,希望更容易阅读
祝你好运 Yogendra讲述了你第一次测试失败的原因。您的const3()失败了(至少对我来说),因为新的术语(0,5)有一个5的expo,它被替换为1 b/c的coef,但1仍然不是0,所以新的术语(0,5)不是常量 不是你问的,但我也会给你一些关于未来的通用Java指针 1) 对静态常量使用所有大写
public static final Term ZERO = new Term(0, 0);
public static final Term UNIT = new Term(1, 0);
这只是Java社区所期望的一种约定
2) 为测试用例指定有意义的名称。测试用例的一个强大用途是,它们可以同时作为假设的文档。不要使用const1()这样的描述性名称,比如zeroShouldBeAConstant()。这会告诉下一个查看代码的人,在这个系统中零应该被视为常量
3)每当返回布尔变量时,只考虑返回语句。将下面的函数与您的函数进行比较,并告诉我哪一个更具可读性:
public boolean isConstant()
{
return expo == 0;
}
它的代码更少,希望更容易阅读
祝你好运 谢谢你的回复。这组测试正是我试图实现的,我明白为什么它现在会给出错误,因为
Zero
会给我(0,1)。但是我不知道如何在构造函数中解决这个问题,除非我遗漏了什么。我认为const3也有一个错误,因为5应该是false,但这不是我关心的。@user1828314:你所说的是什么意思,但我不知道如何在构造函数中解决这个问题,除非我遗漏了什么。
??你想解决什么问题。您的JUnit应该在const1&const3
中更新为assertFalse
。您说过要检查构造函数以解决错误,但不幸的是,我根本看不到如何修复错误。我假设我在定义Zero
时可能做错了什么,我想说的是我正在尝试实现JUnit测试,所以我不应该更改assertFalse
等。我的目标是编辑术语类以适应JUnit测试。@user1828314:我的意思是,尝试了解当coef为0
时,正在更改expo
值的构造函数。为什么要修复此问题?您的意思是测试用例是正确的,您想反向修复代码??谢谢您的回复。这组测试正是我试图实现的,我明白为什么它现在会给出错误,因为Zero
会给我(0,1)。但是我不知道如何在构造函数中解决这个问题,除非我遗漏了什么。我认为const3也有一个错误,因为5应该是false,但这不是我关心的。@user1828314:你所说的是什么意思,但我不知道如何在构造函数中解决这个问题,除非我遗漏了什么。
??你想解决什么问题。您的JUnit应该在const1&const3
中更新为assertFalse
。您说过要检查构造函数以解决错误,但不幸的是,我根本看不到如何修复错误。我假设我在定义Zero
时可能做错了什么,我想说的是我正在尝试实现JUnit测试,所以我不应该更改assertFalse
等。我的目标是编辑术语类以适应JUnit测试。@user1828314:我的意思是,尝试了解当coef为0
时,正在更改expo
值的构造函数。为什么要修复此问题?你是说测试用例是正确的,你想反向修复代码??谢谢你的指针。还实现了您的短代码