0

我们正在尝试定义一个 UnitTest,我们在其中模拟一个对象,我在这里x为简单起见调用它:

...
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import org.kubek2k.springockito.annotations.SpringockitoContextLoader;
import org.kubek2k.springockito.annotations.WrapWithSpy;
...

@ContextConfiguration(
    loader = SpringockitoContextLoader.class,
    inheritLocations = true)
public class SyncServiceIntegrationTest extends AbstractIntegrationTest {

    @Autowired
    @WrapWithSpy
    private EventDrivenIssueDeliveryConfirmer x;

    ...

    @Before
    public void setUp() {
        ...
        doNothing().when(x).foobar(any(Event.class));
    }

    ...

即我们希望我们的 UT(此处未显示)稍后不调用该foobar对象上的方法x

奇怪的是,我们在这个 UT 类的初始化过程中得到了一个 NPE。foobar()当传递的参数为空时,方法抛出 NPE 。

事实证明,这个带参数的调用null发生在 -method 的行doNothing()...setup,在我们的理解中,它应该只是定义模拟对象的存根。但相反,它评估any(Event.class)显然产生的 - 表达式null,然后它调用导致 NPE的foobar(...)- 方法。x

除了 NullPointerException,我们还从 Mockito 收到一条错误消息:

java.lang.NullPointerException: null
... <stack trace omitted for brevity>

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced or misused argument matcher detected here:

-> at ch.sst.integration.SyncServiceIntegrationTest .setUp(SyncServiceIntegrationTest.java:69)

You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
... <examples omitted for brevity>

org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at ch.sst.integration.SyncServiceIntegrationTest .setUp(SyncServiceIntegrationTest.java:69)
...

为什么呢???为什么我们的存根被认为是“未完成的”?我们在这里缺少什么?

后期补充:

这个问题似乎与类 EventDrivenIssueDeliveryConfirmer用@Transactional 标记的事实有关。删除/评论让 UT 成功。但这当然不是解决方法——我们需要那个注释。至少这提供了搜索方向的提示。@Transactional 引起的包装和 Mockito 完成的包装似乎在这里踩到了对方的脚。

4

1 回答 1

0

我有同样的问题,但设置完全不同:kotlin、mockito,当然还有mockito-kotlin。我对这个问题发表评论是因为将来可能有人会用 kotlin mockito 问题来回答这个问题?我确实做到了。无论如何。

当未在 kotlin 中将方法声明为打开时,它会被编译为最终方法,不能被 mockito-kotlin 模拟。结果,该方法被执行,这对我来说有点奇怪,但这就是它的作用。它在https://github.com/mockito/mockito-kotlin/issues/314下的 mockito-kotlin github 问题中提到

于 2022-01-24T15:32:26.040 回答