【问题标题】:Test throws NullPointerException instead of RandomCustomException, but only in some environments测试抛出 NullPointerException 而不是 RandomCustomException,但仅在某些环境中
【发布时间】:2019-01-31 09:27:37
【问题描述】:

我正在从事一个有更多人员和分支机构的项目。有一个测试,由其他人编写,奇怪的是在某些环境中通过而在其他环境中失败。

我们正在开发不同的分支,但我们确保看到的项目版本相同

git pull origin develop

代码如下:

@Test(expected = RandomCustomException.class)
 public void saveReturnsWithCustomException() throws 
   RandomCustomException {
   xService.save(notValidX);   
}

在某些环境中它会抛出 NullPointerException,因此会失败,在其他一些环境中它会抛出 RandomCustomException。

我们检查过了,很奇怪,但是所有相关代码在所有环境中似乎都完全相同。

我的 xService 看起来像:

  public X saveX(X x) throws RandomCustomException {
if (!validXName(X.getName())) {
  throw new RandomCustomException("The given name wasn't correct or the field is empty!");
}
return xRepository.save(x);

xRepository 在测试中被模拟。

xRepository:

public interface xRepository extends JpaRepository<X, Long> {
  X findByApplicationUser(ApplicationUser applicationUser);
}

有没有人建议问题是什么?

【问题讨论】:

  • 在 xService 中的参数 saveX() 'X x' 保证不为空?
  • 感觉就像当你做 X.getName() X 时它抛出 NullPointerException 时为空,你有类似弹簧配置文件的东西存在于某些环境而不是其他环境吗?
  • @D.Tomov 不是,是的,解决方案是将服务中的条件更改为 (x.getName == null || !validXName(X.getName())),但我仍然无法理解它如何在我的环境中为空,而在其他人的环境中不为空。据我所知,我们还没有做任何会影响这里任何事情的事情。无论如何,它有效,所以感谢您的帮助!
  • 第一个问题是你应该调试那个 NPE。如:它来自哪里?然后,查看为空的对象,并了解它为什么为空。现在,我倾向于将其作为 DUP 关闭到stackoverflow.com/questions/218384/… ...因为这里有零信息可以让我们为您提供帮助。一个对象是空的,所以找出是哪个对象,然后从那里开始工作。我们对此无能为力。

标签: java spring testing junit mocking


【解决方案1】:

问题在于,在此方法中,x 变量不保证为 Not Null,因此当您调用方法 getName 时它可能会给出 NullPointerException。

  public X saveX(X x) throws RandomCustomException {
if (!validXName(X.getName())) {
  throw new RandomCustomException("The given name wasn't correct or the field is empty!");
}
return xRepository.save(x);

我只能推测原因可能是“x”是一个 bean。它可能无法满足此环境中的所有实例化要求。您可以尝试将日志转为调试状态。

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多