对象没有被嘲笑。抛出空指针异常

时间:2014-12-17 16:11:53

标签: java unit-testing junit hbase mockito

我正在使用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()附近抛出空指针异常。

只有表格对象被嘲笑。

1 个答案:

答案 0 :(得分:2)

问题在于:

 Mockito.when(hTable.get(get1)).thenReturn(result);

这与您的实际调用不符,因为您的get1不等于实际传递的Get对象。 (看起来相同,但Get不会覆盖equals(),因此使用将任意两个不同对象视为不相等的默认行为。)

我建议您使用Captor捕获Get对象并添加断言以验证是否存在正确的信息。 (我认为这是一种更好的方式来编写这种类型的测试 - 它将所有断言保持在一起,并且如果你传递错误的东西,会导致更好的错误消息。)