对象未被模拟.引发空指针异常



我正在使用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对象并添加断言以验证是否存在正确的信息。(我认为无论如何,这是编写此类测试的更好方法 - 它将所有断言放在一起,如果您传递错误的东西,则会导致更好的错误消息。

相关内容

  • 没有找到相关文章

最新更新