[英]@Mock MessageSource always returns null for getMessage in Junit test
[英]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.