Как сделать ожидаемый объект в методе assertEquals позой (в функции, см. Код ниже) вместо целого или двойного? - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь написать модульный тест для метода 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 пытается сравнить двойник с позой, сгенерированной методом translatePose. Тем не менее, я не уверен, как сделать ожидаемую ценность позой, как, например, фактическая стоимость. Я думал о создании переменной с именем TrcPose2DResult и установке ее равной позе, но я точно не уверен, как это реализовать.

Ответы [ 2 ]

0 голосов
/ 26 января 2020

После просмотра значений в assertEquals я предполагаю, что translatePose(4,2) возвращает TrcPose2D с x = 4.46 и y = 3.58. Это эквивалентно созданию объекта следующим образом: new TrcPose2D(4.46,3.58). Теперь, чтобы проверить реальные объекты, вы должны сначала переопределить метод equals() в TrcPose2D для атрибутов x и y:

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);

}

EDIT : нам нужно было переопределить метод equals (), потому что assertEquals() за кулисами делает что-то вроде этого:

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

И когда мы сравниваем два объекта с ==, вызывается метод .equals(Object o). И в нашем случае, чтобы правильно сравнить наши 2 позы, нам нужно было проверить, равно ли текущее значение x значению o.x и такое же для y.

0 голосов
/ 26 января 2020

Кажется, проблема в вашем первом утверждении:

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

Когда вы сравниваете двойной 0.0 с объектом TrcPose2D в этом утверждении.

Я бы проверил значения x и y этого объекта TrcPose2D вместо этого, как вы делаете в двух других утверждениях, которые также являются двойным значением:

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

И оставьте два других утверждения, как они, чтобы проверить метод translatePose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...