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
值的构造函数。为什么要修复此问题?你是说测试用例是正确的,你想反向修复代码??谢谢你的指针。还实现了您的短代码