![](/img/trans.png)
[英]Ambiguous method call Both assertEquals(Object, Object) in Assert and assertEquals(double, double) in Assert match:
[英]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.46
和y = 3.58
。 这相当于创建这样的对象: new TrcPose2D(4.46,3.58)
。 现在要测试实际对象,您必须首先覆盖TrcPose2D
中x
和y
属性的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.