我有一个非常奇怪的情况,一个已经过几百个版本的测试已经开始失败,但只在Jenkins网站上。它自创建以来就没有被修改过。文件夹最近已被移动,但我不知道这将如何影响测试结果,并且没有其他测试开始失败。
测试只是检查返回对象的相等性。它基本上是这样的:
Trajectory[] trajectory = new Trajectory[Trajectories.numTrajectories];
@Before
public void setup() throws Exception {
for (int i = 0; i < Trajectories.numTrajectories; i++) {
trajectory[i] = mock(Trajectory.class);
// Mock the creation of trajectories
PowerMockito.whenNew(Trajectory.class).withArguments(
"filename" + i).thenReturn(trajectory[i]);
}
Trajectories.create();
}
@Test
public void testCreated() {
// Verify that the created trajectories are correctly returned
for (int i = 0; i < Trajectories.numTrajectories; i++) {
assertEquals(trajectory[i], Trajectories.get(i));
}
}
Trajectories.create()
看起来像:
public static void create() {
for (int i = 0; i < numTrajectories; i++) {
Trajectory t = new Trajectory("filename" + i);
tList.add(t);
}
}
因此,当在Trajectory
中创建Trajectories.create()
对象时,PowerMock会在其位置注入模拟。然后我们比较一下这个模拟是否正确返回。
我甚至添加了一些日志记录来比较本地运行的输出与Jenkins服务器上的输出System.out.println(trajectory[i] + "; " + Trajectories.get(i))
。在本地,一切都匹配:
Mock for Trajectory, hashCode: 1327390425; Mock for Trajectory, hashCode: 1327390425
Mock for Trajectory, hashCode: 1189682735; Mock for Trajectory, hashCode: 1189682735
...
但是詹金斯,我得到了:
Running modelClasses.TestTrajectories
Mock for Trajectory, hashCode: 1455537357; Mock for Trajectory, hashCode: 1230136122
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.393 sec <<< FAILURE!
testCreated(modelClasses.TestTrajectories) Time elapsed: 0.077 sec <<< FAILURE!
java.lang.AssertionError: expected:<Mock for Trajectory, hashCode: 1455537357> but was:<Mock for Trajectory, hashCode: 1230136122>
正如我们所看到的,哈希是不同的。我不明白这个Jenkins服务器上可能会有什么不同会导致这种差异。
Jenkins服务器正在Linux发行版上运行。使用Jenkins Cobertura,Maven和Git插件。使用的Maven目标是clean cobertura:cobertura -Dcobertura.report.format=xml
。
是否有人知道可能导致此不一致的原因?
编辑:说实话,这不是一个很好的测试。它并没有真正测试任何有用的东西,而且看起来更像是对PowerMock的测试,而不是这个代码,但我仍然非常好奇为什么它会突然开始失败。