Java 对象没有被嘲笑。正在引发空指针异常
我正在用mockito框架运行我的代码。框架正在为一个实现创建模拟对象,而没有为另一个对象创建任何模拟对象,因为它正在抛出空指针异常。以下是我的代码和输出: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.
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);