我正在使用mockito框架运行我的代码。 Framework正在为One Implementation创建模拟对象,而不是为其他对象创建任何模拟对象,因为它抛出空指针异常。这是我的代码和输出:
package com.sohi;
import java.io.IOException;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
public class HbaseExample {
private HTablePool pool;
private static final String HTABLE_NAME = "table1";
public String getValue(String rowKey, String columnFamily, String columnName) throws IOException {
HTableInterface table = pool.getTable(HTABLE_NAME);
Get get = new Get(Bytes.toBytes(rowKey)).addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));
System.out.println("Is table Null ? " + (table == null));
Result result = table.get(get);
System.out.println("is result null ? " + (result == null));
byte [] val = result.value();
return Bytes.toString(val);
}
}
我的Mockito测试课程是:
import static org.junit.Assert.*;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import com.sohi.HbaseExample;
@RunWith(MockitoJUnitRunner.class)
public class HbaseExampleTest {
@Mock
HTablePool pool;
@Mock
HTable hTable;
@Mock
Result result;
@InjectMocks
HbaseExample hbase = new HbaseExample();
private static final String HTABLE_NAME = "table1";
private static final String ROW_KEY = "k1";
private static final String COLUMN_FAMILY = "col1";
private static final String COLUMN_NAME = "c1";
private static final String CELL_VALUE = "v1";
@Test
public void test1() throws Exception {
Get get1 = new Get(Bytes.toBytes(ROW_KEY)).addColumn(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes(COLUMN_NAME));
Mockito.when(pool.getTable(HTABLE_NAME)).thenReturn(hTable);
Mockito.when(hTable.get(get1)).thenReturn(result);
Mockito.when(result.value()).thenReturn(Bytes.toBytes(CELL_VALUE));
String str = hbase.getValue(ROW_KEY, COLUMN_FAMILY, COLUMN_NAME);
assertEquals(str, CELL_VALUE);
}
}
输出是:
表是否空?假 结果为null?真
并且还在result.value()附近抛出空指针异常。
只有表格对象被嘲笑。
答案 0 :(得分:2)
问题在于:
Mockito.when(hTable.get(get1)).thenReturn(result);
这与您的实际调用不符,因为您的get1
不等于实际传递的Get
对象。 (看起来相同,但Get
不会覆盖equals()
,因此使用将任意两个不同对象视为不相等的默认行为。)
我建议您使用Captor捕获Get
对象并添加断言以验证是否存在正确的信息。 (我认为这是一种更好的方式来编写这种类型的测试 - 它将所有断言保持在一起,并且如果你传递错误的东西,会导致更好的错误消息。)