场景:之前已经调通了spring junit dbunit来做单测,最近发现由于我需要调用系统B的API。
问题1. 系统B只有测试环境和线上环境,没有单测环境
问题2. 即使B有单测环境,也没有像DBUnit这样方便的环境,当我测试完delete之后,他会自动帮我恢复被删除的数据
Mockito出场了...
目标:通过mock一个B系统的client,让我们单测的时候不真实访问B系统
关键代码:
测试类:
……
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"/applicationContext-dao.xml",
"/applicationContext-service.xml",
"/applicationContext-resources.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class})
@DatabaseSetup("classpath:/allTables.xml")
public class DraftServiceTest {
@Autowired
private DraftService draftService;
@Mock
private IncognitoClient incognitoClient;
@Mock
private HiveClient hiveClient;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
doNothing().when(incognitoClient).delete(eq(Job.class), anyLong());
when(hiveClient.isTableExists(anyString(), anyString())).thenReturn(true);
when(hiveClient.getTableColumnsAndPartitionFields(anyString(), anyString())).thenReturn(buildMockDataOriginTable());
doNothing().when(hiveClient).alterColumn(anyString(), anyString(), anyString(), anyString(), anyString());
ReflectionTestUtils.setField(AopTargetUtils.getTarget(draftService), "incognitoClient", incognitoClient);
ReflectionTestUtils.setField(AopTargetUtils.getTarget(draftService), "hiveClient", hiveClient);
……
}
/**
* 测试整个的处理过程
* @throws Exception
*/
@Test
public void testDraft() throws Exception {
……
}
}
另外需要有一个AopTargetUtils类来完成spring aotuwired的类中成员对象替换为mock的对象,见下面链接:
http://pan.baidu.com/s/1c1hFWf2