Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象没有被嘲笑。正在引发空指针异常_Java_Unit Testing_Junit_Hbase_Mockito - Fatal编程技术网

Java 对象没有被嘲笑。正在引发空指针异常

Java 对象没有被嘲笑。正在引发空指针异常,java,unit-testing,junit,hbase,mockito,Java,Unit Testing,Junit,Hbase,Mockito,我正在用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.

我正在用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);
    }

}

我的Mockito测试类是:


输出为:

表是否为空?假的 结果是否为空?真的

并在result.value()附近引发空指针异常

只有表对象被模拟。

问题在于:

 Mockito.when(hTable.get(get1)).thenReturn(result);
这与实际调用不匹配,因为您的
get1
不等于实际传递的
Get
对象。(它看起来相同,但是
Get
不会覆盖
equals()
,因此使用默认行为,将任意两个不同的对象视为不相等。)


我建议您使用Captor来捕获
Get
对象,并添加断言以验证是否存在正确的信息。(无论如何,我认为这是编写此类测试的一种更好的方法——它将所有断言保持在一起,如果您传递了错误的东西,则会产生更好的错误消息。)

我在其他工作空间中使用了与它相同的代码。但在新的工作空间里,我遇到了这个问题。我不知道到底出了什么问题,我敢打赌这不完全一样。您拥有的将适用于覆盖
equals()
的许多对象;但是
Get
不是其中之一。我知道了。我曾经从两个版本中获取。我在旧图书馆遇到了这个问题。当我在Get中包含相等的元素时,它就起作用了。但我必须和旧图书馆合作。如果是这样,那么我可以模拟该对象(因为它没有equals方法)。有什么建议吗?使用捕快(见答案最后一段,和)。或者您可以编写自己的自定义参数匹配器(),但我认为这要复杂得多。
 Mockito.when(hTable.get(get1)).thenReturn(result);