Spring+Mockito+PowerMock+spring-test-dbunit+hsqldbを使ってセルテストを行うと100%のカバー率が得られます.
使用 MockitoはeasyMockより簡単です.
使用 PowerMockは静的、プライベートの方法をシミュレートすることができます.
spring-test-dbunitを使って、データベースにxmlを導入して、テストデータを提供します.
使用 PowerMockは静的、プライベートの方法をシミュレートすることができます.
spring-test-dbunitを使って、データベースにxmlを導入して、テストデータを提供します.
@DatabaseSetup
@DatabaseTearDown
hsqldb , 。
1、maven
junit junit 4.11 test org.springframework spring-test 3.2.4.RELEASE test org.dbunit dbunit 2.4.9 test com.github.springtestdbunit spring-test-dbunit 1.0.1 test org.hsqldb hsqldb 2.3.1 test org.powermock powermock-module-junit4-rule-agent 1.5.5 test org.mockito mockito-all ${mockito.version} test org.powermock powermock-module-junit4 ${powermock.version} test org.powermock powermock-api-mockito ${powermock.version} test 2、 BaseSpringTest
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/bcs-spring-context-test.xml") @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class }) @Transactional public abstract class BaseSpringTest { }
3、
hsqldbを使う時は注意してください.@PrepareForTest({ HttpClientUtil.class })// powermock public class IdCardValidateServiceImplTest extends BaseSpringTest { @Resource @InjectMocks // private IdCardValidateService idCardValidateService; @Resource private AppConfig appConfig; @Mock // private SequenceDao sequenceDao; @Rule //spring powermock PowerMockRule public PowerMockRule rule = new PowerMockRule(); private static final String MOCK_RETURN_SUCC_XML = "
"; @Before public void setUp() { MockitoAnnotations.initMocks(this); PowerMockito.mockStatic(HttpClientUtil.class);// powermock } // , , 。 @Test @DatabaseSetup({"classpath:/dbunit/T_BCS_IDCARD_INFO.xml", "classpath:/dbunit/T_BCS_PLAT.xml"}) @DatabaseTearDown(value = {"classpath:/dbunit/T_BCS_IDCARD_INFO.xml", "classpath:/dbunit/T_BCS_PLAT.xml"},type = DatabaseOperation.TRUNCATE_TABLE) public void testValidate() throws Exception { String seq =RandomStringUtils.randomNumeric(7); Mockito.when(sequenceDao.getIdcardLogSeq()).thenReturn(Long.valueOf(seq));//Mockito Mockito.when(sequenceDao.getIdcardInfoSeq()).thenReturn(Long.valueOf(seq));//Mockito IdCardReq req = new IdCardReq(); req.setReqSeq("123"); req.setPlatCode("1001"); req.setRequestTime(new Date()); req.setNeedPhoto(false); IDCardVO idCardVO = new IDCardVO(); idCardVO.setIdentityNo("430022198509136854"); idCardVO.setIdentityType("00"); idCardVO.setRealName(" "); req.setIdCard(idCardVO); List params = IdCardValidateServiceImpl.getParamList(req, appConfig); //PowerMock PowerMockito.when(HttpClientUtil.doPost(appConfig.getGztUrl(),params,"UTF-8")).thenReturn(MOCK_RETURN_SUCC_XML); BcsResponse 0000 043101180050000 01 3xf89Hoqpk0VIH/9k= 1001123 20150120154442 C0AED4A3EE24D4913C71E6DBD323D1EB res = idCardValidateService.validate(req); Assert.assertEquals(ErrorCodeEnum.SUCCEED_CODE.getErrorcode(),res.getErrorCode()); Assert.assertEquals(ErrorCodeEnum.SUCCEED_CODE.getErrordesc(),res.getErrorMsg()); } }
データタイプ区別oracle hsqldb varrrhar 2 varrhar number NUMERIC ダテ TIMESTAMPはまたhsqldbでsequenceを取得するにはoracleとは違っていますので、シミュレーションが必要です.