2017-02-20 28 views
0

我正在學習用的Mockito框架JUnit的,我想對我的服務代碼編寫測試用例: -的JUnit的Mockito框架

ChildClass childClass = (ChildClass)(employeeDao.callMethod().getClassRef()); 

JUnit測試案例: -

ChildClass childClass = new ChildClass(); 
Mockito.when(employeeDao.callMethod().getClassRef()).thenReturn(childClass); 

但是,得到的Java。 lang.NullPointerException

然後試圖分裂法就像兩個單獨的語句調用: -

ChildClass childClass = new ChildClass(); 
Mockito.when(employeeDao.callMethod()).thenReturn(employeeInstance); 
Mockito.when(employeeInstanceMocked.getClassRef()).thenReturn(childClass); 

但由於Mockito仍然得到對象強制異常返回SuperClassObject但代碼投射到ChildClass對象。目前的Java代碼是否與JUnit測試用例100%兼容,或者我錯過了某些觀點。

+0

你在哪裏爲'employeeInstance'創建模擬? –

+0

使用@Mock EmployeeInstance employeeInstance;在測試課上。 –

+0

你有'thenReturn(employeeInstance)',但是在下一行中,你正在使用'employeeInstanceMocked'。這是一個錯字?你希望這些都是一樣的。 –

回答

0

當需要模擬對象時,您需要使用模擬類。如果你想要一個實際的類的行爲,例如你嘗試打電話給你的道的引用,你需要使用間諜。

的Junit:

ChildClass childClass = Mockito.spy(new ChildClass()); 
+0

您測試了這個,還是僅僅是一個猜測? –

1

你可以做的Mockito此。從documentation例如:

Foo mock = mock(Foo.class, RETURNS_DEEP_STUBS); 

// note that we're stubbing a chain of methods here: getBar().getName() 
when(mock.getBar().getName()).thenReturn("deep"); 

// note that we're chaining method calls: getBar().getName() 
assertEquals("deep", mock.getBar().getName()); 

但在文檔中提到這是不好的做法,因違反Law of Demeter