我正在使用mockito框架运行我的代码。框架正在为一个实现创建模拟对象,而不是为其他对象创建任何模拟对象,因为它会引发空指针异常。这是我的代码和输出:
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);
}
}
我的模拟测试课是:
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);
}
}
输出为 :
表为空吗?结果为空吗?真
并且还在 result.value() 附近抛出空指针异常。
只有表对象被模拟。
问题就在这里:
Mockito.when(hTable.get(get1)).thenReturn(result);
这与您的实际调用不匹配,因为您的get1
不等于实际传递的Get
对象。(它看起来相同,但Get
不会覆盖equals()
因此使用将任何两个不同对象视为不相等的默认行为。
我建议您使用 Captor 来捕获Get
对象并添加断言以验证是否存在正确的信息。(我认为无论如何,这是编写此类测试的更好方法 - 它将所有断言放在一起,如果您传递错误的东西,则会导致更好的错误消息。