簡體   English   中英

我的 toString junit 測試失敗,我有一個幾乎相同的 toString junit 測試運行良好,我不知道問題是什么

[英]My toString junit test is failing, I have an almost identical toString junit test that runs fine, I don't know what the problem is

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 擁有一個房間的 arraylist,房間的 toString 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 的構造函數和測試打印的錯誤更新了這篇文章。

您正在覆蓋Floor class 中的toString()方法。 toString 創建格式字符串

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

而在您的斷言語句中,您正在檢查前綴是否為"Room:[" 這就是你的單元測試失敗的原因。 此外,您正在斷言房間數,但您沒有在構造函數中設置房間數。

這是我針對這種情況的建議,您可以為每次檢查使用不同的斷言語句,這將指向您失敗的檢查。

在測試 class FloortoString方法的testToString方法中, Floor的“測試”實例不包含房間。 因此,根據您問題中的代碼, class FloortoString方法返回以下內容:

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

你在 class FloortoString方法沒有返回房間數,那你為什么要測試它是否以房間數結尾呢?

為了使您的測試代碼正常工作,您需要更改測試代碼或更改方法toString在 class Floor 對於后者,class Floor中的toString方法應為:

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

然后對於Floor的測試實例, toString方法將返回:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM