【问题标题】:Mockito NullPointerException on Native Query本机查询上的 Mockito NullPointerException
【发布时间】:2015-09-02 14:49:31
【问题描述】:

我的查询对象有问题,即使我使用查询模拟对象存根它,它也会变为空。 这是代码

Query query = getEntityManager().createNativeQuery(queryString, SomeRandom.class);

return query.getResultList(); //-->This is where I get the error, the query object is null.

我的测试方法是

Query query = mock(Query.class);
when(entityManager.createNativeQuery("", SomeRandom.class)).thenReturn(query);
List<SomeRandom> someList = requestDao.getSomeList(parameter, parameter, parameter, parameter);

【问题讨论】:

  • 在模拟 createNativeQuery 函数时,您是否尝试过 anyString() 而不是空字符串 ("")?
  • 是的,我做到了,但我已经解决了这个问题。谢谢顺便说一句。

标签: java mockito


【解决方案1】:

这可能意味着您传递给模拟方法的匹配器之一不匹配。您传递了一个实际的String 实例(空字符串),该实例在后台转换为Equals matcher。只有当 queryString 也是空字符串时,您的示例才有效。

这应该匹配任何查询字符串:

when(entityManager.createNativeQuery(anyString(), eq(SomeRandom.class)))
  .thenReturn(query);

这在您希望传递的一些具体字符串上:

String expectedQueryString = "select 1";

when(entityManager.createNativeQuery(expectedQueryString, SomeRandom.class))
  .thenReturn(query);

根据评论编辑:

如果从eq(SomeRandom.class) 更改为any() 解决了问题,则eq(SomeRandom.class) 匹配器不匹配,这意味着SomeRandom.class 实际上不是传递给模拟方法的。

【讨论】:

【解决方案2】:

我可以用这段代码做到这一点,我用过 This 作为我的参考。

Class<?> type = Mockito.any();
when(entityManager.createNativeQuery(Mockito.anyString(), type)).thenReturn(query);

【讨论】:

  • 永远不要将 Mockito 匹配器提取到局部变量中。Matchers work via side-effects,像您在此处进行的提取会使它们错位。此代码目前有效(因为any 不检查有关参数的任何内容)但如果您将匹配器更改为eq 或其他任何内容,这将以难以诊断的方式中断。
  • 谢谢,我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2017-08-21
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多