Mockito 是一个嘲弄的框架。它比 JUnit 更进一步,允许您测试对象之间的交互,而不必复制整个环境。您可以在其项目网站上阅读有关 Mockito 的更多信息, https://code.google.com/p/mockito/ 。
您可以使用 Mockito 在较小的单元上进行单元测试。例如,您可以模拟org.apache.hadoop.hbase.Server
实例或org.apache.hadoop.hbase.master.MasterServices
接口参考而不是完整的org.apache.hadoop.hbase.master.HMaster
。
此示例基于 unit.tests 中的示例代码,以测试insertRecord
方法。
首先,将 Mockito 的依赖项添加到 Maven POM 文件中。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.1.0</version>
<scope>test</scope>
</dependency>
接下来,将@RunWith
注释添加到测试类,以指示它使用 Mockito。
@RunWith(MockitoJUnitRunner.class)
public class TestMyHBaseDAO{
@Mock
Configuration config = HBaseConfiguration.create();
@Mock
Connection connection = ConnectionFactory.createConnection(config);
@Mock
private Table table;
@Captor
private ArgumentCaptor putCaptor;
@Test
public void testInsertRecord() throws Exception {
//return mock table when getTable is called
when(connection.getTable(TableName.valueOf("tablename")).thenReturn(table);
//create test object and make a call to the DAO that needs testing
HBaseTestObj obj = new HBaseTestObj();
obj.setRowKey("ROWKEY-1");
obj.setData1("DATA-1");
obj.setData2("DATA-2");
MyHBaseDAO.insertRecord(table, obj);
verify(table).put(putCaptor.capture());
Put put = putCaptor.getValue();
assertEquals(Bytes.toString(put.getRow()), obj.getRowKey());
assert(put.has(Bytes.toBytes("CF"), Bytes.toBytes("CQ-1")));
assert(put.has(Bytes.toBytes("CF"), Bytes.toBytes("CQ-2")));
assertEquals(Bytes.toString(put.get(Bytes.toBytes("CF"),Bytes.toBytes("CQ-1")).get(0).getValue()), "DATA-1");
assertEquals(Bytes.toString(put.get(Bytes.toBytes("CF"),Bytes.toBytes("CQ-2")).get(0).getValue()), "DATA-2");
}
}
该代码用ROWKEY-1'',
DATA-1'',``DATA-2''填充HBaseTestObj
作为值。然后它将记录插入到模拟表中。捕获 DAO 将插入的 Put,并测试值以验证它们是否符合您的预期。
这里的关键是在 DAO 之外管理 Connection 和 Table 实例创建。这允许您干净地模拟它们并测试 Puts,如上所示。同样,您现在可以扩展到其他操作,例如“获取”,“扫描”或“删除”。