java - 如何使 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 的变量并将其设置为等于一个姿势,但我不确定如何实现这一点。
解决方案
在看到 assertEquals 中的值之后,我假设translatePose(4,2)
返回 a TrcPose2D
with x = 4.46
and y = 3.58
。这相当于创建这样的对象:new TrcPose2D(4.46,3.58)
. 现在要测试实际的对象,您必须首先覆盖and属性的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);
}
编辑:我们需要重写 equals() 方法,因为assertEquals()
幕后正在做这样的事情:
if (expectedResult == actualResult)
return true;
return false;
而当我们比较两个对象时,==
该.equals(Object o)
方法就会被调用。在我们的例子中,为了正确比较我们的 2 个姿势,我们需要检查当前x
值是否等于o.x
value 和是否相同y
。
推荐阅读
- c - 为什么 fgets 会读取我在 scanf 中的第一个输入?
- javascript - 使用 Javascript 选择嵌套元素
- javascript - 如何仅在第一页加载时显示弹出窗口
- c++ - 想要检测特征并在 2 个不同的帧中匹配特征
- sas - 如何在SAS中按字母顺序对地址进行排序?
- javascript - ReactJS API 数据获取 CORS 错误
- python - 自动转换为新数据 - Pandas
- ms-access - MS Access:使用 acDialog 打开的报告在变得不可见时不会返回控制权
- python - 如何在熊猫中将连续第一次出现的“真”更改为假
- java - 如何让 java 打开 cmd 并合并 csv 文件的文件夹?