簡體   English   中英

為什么我的模擬測試總是通過返回null但必須返回String的方法

[英]Why my mock test always pass for method which returns null but must return String

我正在測試以檢查方法是否返回正確的字符串。 但是,即使方法返回null ,測試也將通過! 為什么會發生? 如何正確編寫測試? 謝謝!

// TestMyObj.java: My test class
public class TestMyObj {
    @InjectMocks
    private MyClass myClass;

    @Mock
    TestObj testObj;

    private final String test = "test";

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);  // or use mockito runner
    }

    @Test
    public void test() {
        when(testObj.get()).thenReturn(test);
        Assert.assertTrue(myClass.get().equals(test));
        verify(testObj).get();
    }
}

// MyClass.java: Class which uses my object
public class MyClass {
    private TestObj testObj;

    public MyClass() {}
    public MyClass(TestObj testObj) { this.testObj = testObj; }
    String get() { return testObj.get(); }
}

// TestObj.java: My testing object 
public class TestObj {
    String get() { return null; }
}

myClass.get()返回testObj.get() ; 同時,使用when(...)指示testObj.get()返回test

因此myClass.get()基本上等同於test ,而Assert.assertTrue(myClass.get().equals(test)) Assert.assertTrue(test.equals(test))Assert.assertTrue(test.equals(test)) ,當test不為null時,斷言ok(並且在您的情況下不為null )。

順便說一句

Assert.assertTrue(expected.equals(actual));

最好寫

Assert.assertEquals(expected, actual);

它將為您提供有關故障的診斷消息,從中您將看到期望的值以及為第二個參數實際賦予的值。

所以我會像這樣重寫相同的測試

@Test
public void test() {
    when(testObj.get()).thenReturn("test");
    assertEquals("test", myClass.get());
    verify(testObj).get();
}

這似乎是有道理的:我們正在測試MyClass正確調用其協作者testObj並將其返回值返回給我們。

在這里使用常量而不是test變量似乎是正確的選擇。 首先,由於常量在兩條相鄰的行中使用,因此“我在一個位置更改了常量卻忘記了在另一個位置進行了操作”沒有問題。 其次,現在沒有間接級別(隨該test變量引入),因此代碼更易於理解。

正如其他人所解釋的那樣-首先請仔細閱讀您所使用的概念。

這里的關鍵:你在嘲笑你的測試類的該實例。 因此,返回null的方法的實際實現根本不重要。 因為您創建了一個模擬對象並指示Mockito在調用get()時返回非null值。 因此,返回null的真實方法主體永遠不會在您顯示給我們的代碼中執行。

這就是全部。

暫無
暫無

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

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