我的 toString junit 测试失败,我有一个几乎与字符串相同的 junit 测试运行良好,我不知道问题是什么



toString方法:

@Test
public void testToString() {
Floor f = new Floor("Ground Floor");
String toStr = f.toString();

assertTrue("The toString method should be in standard convention format",
toStr.startsWith("Room:[") && 
toStr.contains("=" + f.getFloorName() + ", ") &&
toStr.endsWith("=" + f.getRoomsTotal() + "]"));
}

获取方法:

public String getFloorName() {
return floorName;
}
public int getRoomsTotal() {
return rooms.size();
}

我不明白为什么它失败了,Floor有一个Room的数组列表,其中Room的测试几乎与String junit测试相同:

@Test
public void testToString() {
Room room = new Room("Bathroom", 1);
String toStr = room.toString();

assertTrue("The toString method should be in standard convention format",
toStr.startsWith("Room:[") && 
toStr.contains("=" + room.getRoomName() + ", ") &&
toStr.endsWith("=" + room.getOutletCount() + "]"));
}

建设者:

/** The default constructor */
public Floor() {
floorName = "";
rooms = new ArrayList<>();
}
/** The custom constructor, create a new instance with user given values.
* 
* @param floorName Set the floor name.
*/
public Floor(String floorName) {
this.floorName = floorName;
rooms = new ArrayList<>();
}

错误:

java.lang.AssertionError: The toString method should be in standard convention format
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.assertTrue(Assert.java:41)
at lib.FloorTest.testToString(FloorTest.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:42)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
at java.util.Iterator.forEachRemaining(Unknown Source)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.ReferencePipeline.forEach(Unknown Source)
at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:83)
at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:74)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

超控:

@Override
public String toString() {
return "Floor:[floorName=" + floorName + ", rooms=" + rooms + "]";
}

怎么了?

更新了这篇文章,介绍了地板的施工人员和测试中打印出来的错误。

您正在重写Floor类中的toString()方法。toString创建一个格式的字符串

"Floor:[floorName=" + floorName + ", rooms=" + rooms + "]";

而在您的assert语句中,您正在检查前缀是否为"Room:["。这就是单元测试失败的原因。此外,您正在断言房间数,但尚未在构造函数中设置房间数。

以下是我对这种情况的建议,您可以对每个检查使用不同的断言语句,然后将指向失败的检查。

在测试类FloortoString方法的testToString方法中;测试";Floor的实例不包含任何房间。因此,根据您问题中的代码,类FloortoString方法返回以下内容:

Floor:[floorName=Ground Floor, rooms=[]]

Floor中的toString方法不返回房间数,那么为什么要测试它是否以房间数结束呢?

为了使测试代码正常工作,您需要更改测试代码或更改类Floor中的方法toString。对于后者,类Floor中的方法toString应该是:

return "Floor:[floorName=" + floorName + ", rooms=" + getRoomsTotal() + "]";

然后对于Floor的测试实例,toString方法将返回:

Floor:[floorName=Ground Floor, rooms=0]

最新更新