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

问题描述

我正在尝试为方法 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 的变量并将其设置为等于一个姿势,但我不确定如何实现这一点。

标签: javaunit-testing

解决方案


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

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值是否等于o.xvalue 和是否相同y


推荐阅读