小编dom*_*aru的帖子

在非最终非静态类上,mock-maker-inline 使测试失败,并显示“传递给 Mockito.mockingDetails() 的 NotAMockException 参数应该是一个模拟”

我有一个 JUnit 测试,其中有 5 个模拟,其中一个模拟类是最终的,我启用了 mock-maker-inline 来克服这个问题,现在测试通过了,但在测试执行结束时,我还得到了 NotAMockException:

org.mockito.exceptions.misusing.NotAMockException: Argument passed to Mockito.mockingDetails() should be a mock, but is an instance of class ...Locals!
at org.mockito.internal.runners.DefaultInternalRunner$1$2.testFinished(DefaultInternalRunner.java:63)
    at org.junit.runner.notification.SynchronizedRunListener.testFinished(SynchronizedRunListener.java:56)
    at org.junit.runner.notification.RunNotifier$7.notifyListener(RunNotifier.java:190)
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72)
    at org.junit.runner.notification.RunNotifier.fireTestFinished(RunNotifier.java:187)
    at org.junit.internal.runners.model.EachTestNotifier.fireTestFinished(EachTestNotifier.java:38)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:331)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:74)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:80)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
...
Run Code Online (Sandbox Code Playgroud)

嘲笑非常简单:

    @Mock
    private Locals locals; //class

    @Mock
    private Globals globals; // class

    @Mock
    private Cache …
Run Code Online (Sandbox Code Playgroud)

java junit mockito

5
推荐指数
1
解决办法
3208
查看次数

在Java中进行空检查的最优雅的方法是什么

举个例子,假设我们有如下代码:

String phone = currentCustomer.getMainAddress().getContactInformation().getLandline()
Run Code Online (Sandbox Code Playgroud)

众所周知,Java 中没有 elvis 运算符,并且可以像这样捕获 NPE:

String phone = null;
try {
    phone = currentCustomer.getMainAddress().getContactInformation().getLandline()
} catch (NullPointerException npe) {}
Run Code Online (Sandbox Code Playgroud)

没有人会建议。使用 Java 8Optional是一种解决方案,但代码远不够清晰可读 -> 大致如下:

String phone = Optional.ofNullable(currentCustomer).flatMap(Customer::getMainAddress)
    .flatMap(Address::getContactInformation)
    .map(ContactInfo::getLandline)
    .orElse(null);
Run Code Online (Sandbox Code Playgroud)

那么,是否还有其他稳健且不牺牲可读性的解决方案呢?

编辑:下面已经有一些好的想法,但让我们假设模型是自动生成的(不方便每次更改)或在第三方 jar 中,需要从源重建才能修改。

java nullable nullpointerexception option-type

4
推荐指数
1
解决办法
761
查看次数