我在我的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