繁体   English   中英

如何使 assertEquals 方法中的预期对象成为姿势(在函数中,请参见下面的代码)而不是整数或双精度数?

[英]How do you make the expected object in an assertEquals method a pose (in a function, see code below) instead of an integer or double?

我正在尝试为方法 translatePose(下面的代码)编写单元测试。

public TrcPose2D translatePose(double xOffset, double yOffset)
    {
        final String funcName = "translatePose";
        TrcPose2D newPose = clone();
        double angleRadians = Math.toRadians(newPose.angle);
        double cosAngle = Math.cos(angleRadians);
        double sinAngle = Math.sin(angleRadians);

        newPose.x += xOffset*cosAngle + yOffset*sinAngle;
        newPose.y += -xOffset*sinAngle + yOffset*cosAngle;

        if (debugEnabled)
        {
            dbgTrace.traceInfo(funcName, "xOffset=%.1f, yOffset=%.1f, Pose:%s, newPose:%s",
                    xOffset, yOffset, this, newPose);
        }

        return newPose;
    }   //translatePose

我写了一个快速模板,它看起来像:

public class TrcPose2DTest {
    @Test
    public void testTranslatePose() {

        assertEquals(0.0, new TrcPose2D(0,0));
        assertEquals(4.46, new TrcPose2D(4,2).translatePose(4,2).x, 1e-9);
        assertEquals(3.58, new TrcPose2D(4,2).translatePose(4,2).y, 1e-9);

问题是assertEquals 试图将double 与translatePose 方法生成的姿势进行比较。 但是,我不确定如何使预期值成为姿势,就像实际值一样。 我想过创建一个名为 TrcPose2DResult 的变量并将其设置为一个姿势,但我不确定如何实现这一点。

问题似乎是你的第一个断言:

assertEquals(0.0, new TrcPose2D(0,0));

当您将双 0.0 与该断言中的 TrcPose2D 对象进行比较时。

我将检查该 TrcPose2D 对象的 x 和 y 值,而不是像您在其他两个断言中所做的那样,这些断言也是双精度值:

assertEquals(0.0, new TrcPose2D(0,0).x, 1e-9);
assertEquals(0.0, new TrcPose2D(0,0).y, 1e-9);

并保留其他两个断言以测试translatePose方法。

在看到 assertEquals 中的值后,我假设translatePose(4,2)返回一个TrcPose2D其中x = 4.46y = 3.58 这相当于创建这样的对象: new TrcPose2D(4.46,3.58) 现在要测试实际对象,您必须首先覆盖TrcPose2Dxy属性的equals()方法:

public class TrcPose2D {
    public double x;
    public double y;

    //constructor

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TrcPose2D trcPose2D = (TrcPose2D) o;
        return Double.compare(trcPose2D.x, x) == 0 &&
                Double.compare(trcPose2D.y, y) == 0;
    }
}

现在 equals 方法已被覆盖,我们可以这样编写测试:

public void testTranslatePose() {

    TrcPose2D expectedResult = new TrcPose2D(4.46, 3.58);
    TrcPose2D poseBeforeTranslate = new TrcPose2D(4, 2);
    TrcPose2D actualResult = poseBeforeTranslate.translatePose(4, 2);

    assertEquals(expectedResult, actualResult);

}

编辑:我们需要覆盖 equals() 方法,因为幕后的assertEquals()正在做这样的事情:

if (expectedResult == actualResult)
        return true;
    return false;

当我们用==比较两个对象时,会调用.equals(Object o)方法。 在我们的例子中,为了正确比较我们的 2 个姿势,我们需要检查当前的x值是否等于ox值并且y相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM