【问题标题】:Null Pointer Exception in Unit test in spockspock单元测试中的空指针异常
【发布时间】:2018-02-22 22:37:09
【问题描述】:

我有一个具有以下 fn 的类“ComparisonService”-

public HashMap <String, Map<String, Object>> fetchTableData(DataSource dataSource, List<Object> tableInfo){
    table.setTableInfo(tableInfo);
    HashMap<String, Map<String, Object>> records = table.fetchData(dataSource);
    System.out.println(records.size());
    return records;
}

这里的表是其他类表的对象

我正在为此方法编写一个 spock 测试-

class ComparisonSpec extends spock.lang.Specification{
Table table=Mock()
def DataSource dataSource
def List<Object> tableInfo=[1]
def setup()
{
    //def DataSource dataSource 
}
def "first function"()
{
    given:
    def ComparisonService comparison= new ComparisonService()
    when:
    comparison.fetchTableData(dataSource,tableInfo)
    then:
    1*table.setTableInfo(_ as String)>>true
    1*table.fetchData(_ as DataSource)
}

当我运行它时,我得到了

空指针异常 比较.fetchTableData(dataSource,tableInfo).

为什么会这样。

【问题讨论】:

  • 可能是因为def DataSource dataSource 表示您的数据源是null。尝试实例化或模拟它
  • 我已经尝试过将“def DataSource dataSource”更改为“DataSource dataSource=Mock()”,但仍然会出现空指针异常。
  • 您创建 table 作为模拟,但您从未将其传递给您的 comparison 实例。此外,1*table.fetchData(_ as DataSource) 至少需要返回一个空映射,否则records.size() 也会抛出 NPE。

标签: java unit-testing spock


【解决方案1】:

原因可能是records的变量为null,你应该mock for records。

【讨论】:

  • 您当前状态下的答案与其说是一个答案,不如说是一个评论,您能给出一个您想到的解决方案的代码示例吗?
【解决方案2】:

好的,我可以看到几点:

第一 def DataSource dataSource 您正在尝试静态和动态键入您的变量。这应该是:

  • 静态:DataSource dataSource
  • 动态:def dataSource

第二 您声明变量 dataSource 但从不初始化它。在测试或您需要的设置中: dataSource = &lt;what ever data source is&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多