Spring+Mockito+PowerMock+spring-test-dbunit+hsqldbを使ってセルテストを行うと100%のカバー率が得られます.

5976 ワード

使用 MockitoはeasyMockより簡単です.
使用 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、      
 
  
@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 = "0000043101180050000013xf89Hoqpk0VIH/9k=100112320150120154442C0AED4A3EE24D4913C71E6DBD323D1EB";
   
    @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 res =  idCardValidateService.validate(req);
        Assert.assertEquals(ErrorCodeEnum.SUCCEED_CODE.getErrorcode(),res.getErrorCode());
        Assert.assertEquals(ErrorCodeEnum.SUCCEED_CODE.getErrordesc(),res.getErrorMsg());

    }
}
hsqldbを使う時は注意してください.
データタイプ区別oracle          hsqldb  varrrhar 2        varrhar number          NUMERIC  ダテ            TIMESTAMPはまたhsqldbでsequenceを取得するにはoracleとは違っていますので、シミュレーションが必要です.