我正在为我的Spring应用程序编写服务层的单元测试。
这是我的服务类:
@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
,在调用测试方法之前,我需要显式设置它,否则会在StubRequestService.getRequest
方法中出现nullPointerException
,因为requestDao
在该方法中为空。 - 在单元测试Spring服务层时应遵循哪些良好的实践?(如果我做错了什么)