【问题标题】:Mockito when()...then() NullPointerExceptionMockito when()...then() NullPointerException
【发布时间】:2015-12-11 12:02:40
【问题描述】:

productsInDatabse 是一个 hashMap,输出是枚举,scanCode 来自被测试的类

   public static boolean isInDataBase(int code) {
        return productsInDatabse.containsKey(code);
    }

我有一个测试:

@Test
public void testScanCodeForCodeNotFound() {

    Database db = Mockito.mock(Database.class);
    when(db.isInDataBase(444)).thenReturn(false);
    output = scanner.scanCode("444");
    assertTrue(output == ProductProcessing.PRODUCT_NOT_FOUND);

}

但是 when()...then() 返回 NPE。我在调用时看到的例子就是这样的。所以我的问题是错误在哪里,因为我认为 when()...then() 就像那样工作。

堆栈跟踪:

Testcase: testScanCodeForCodeNotFound(iodevices.BarCodesScannerTest):   Caused an ERROR
null
java.lang.NullPointerException
    at database.Database.isInDataBase(Database.java:66)
    at iodevices.BarCodesScannerTest.testScanCodeForCodeNotFound(BarCodesScannerTest.java:50)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)


Test iodevices.BarCodesScannerTest FAILED

【问题讨论】:

  • 请添加堆栈跟踪。
  • 方法isInDataBase是最终的吗?
  • 不,它是 public static boolean isInDataBase(int code)
  • 您正在从非静态上下文中调用静态方法。此外,您不能模拟静态方法。
  • 使用PowerMock

标签: java junit mockito


【解决方案1】:

从您的 isInDataBase() 声明中删除 static

如果您无法删除静态,请查看此内容:Mocking static methods with Mockito

【讨论】:

    【解决方案2】:

    你不能用 Mockito 模拟 static 方法;你需要PowerMock

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多