我在我的spring應用程序中爲服務層編寫單元測試。
這裏是我的服務類使用Mockito進行單元測試
@Service
public class StubRequestService implements RequestService {
@Autowired
private RequestDao requestDao;
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
@Override
public Request getRequest(Long RequestId) {
Request dataRequest = requestDao.find(requestId);
return dataRequest;
}
}
這裏是我的測試類
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" })
public class StubRequestServiceTest {
@Mock
public RequestDao requestDao;
StubRequestService stubRequestService; // How can we Autowire this ?
@org.junit.Before
public void init() {
stubRequestService = new StubRequestService(); // to avoid this
stubRequestService.setRequestDao(dataRequestDao);
// Is it necessary to explicitly set all autowired elements ?
// If I comment/remove above setter then I get nullPointerException
}
@Test
public void testGetRequest() {
Request request = new Request();
request.setPatientCnt("3");
when(requestDao.find(anyLong())).thenReturn(request);
assertEquals(stubRequestService.getRequest(1234L).getPatientCnt(),3);
}
}
其工作正常,但我有幾個問題
- 如何在測試中,我們
Autowire
服務類?我使用構造函數init()
方法創建服務對象。 - 我們是否需要爲服務類別設置所有
Autowire
元素?對於例如StubRequestService
有自動裝配RequestDao
,我需要在調用測試方法之前明確設置,否則它給出nullPointerException
爲requestDao
爲null
的StubRequestService.getRequest
方法。 - 當單元測試Spring服務層時,哪些是最佳實踐? (如果我做錯了什麼)。
如果你改變你的問題給出的答案之後,答案就沒有多大意義了。我會回滾你最後的編輯。 – 2011-12-28 12:53:17
@JB:道歉編輯問題。我只是想提供正確和準確的信息。謝謝 – xyz 2011-12-28 12:54:19