如何在 Arquillian 测试中监视 CDI bean

问题描述

在我之前的 Spring 开发中,很容易通过 @SpyBean 或 Mockito spy 方法窥探 Spring bean,并在测试代码中做一些存根和验证。

但是当我尝试在 Arquiillain 测试中对 Jakarta EE 应用程序执行相同的步骤时,它没有按预期工作。

@Inject CargoinspectionService cargoinspectionService;


@Test
public void testCargoWasHandled(){
    var cargoinspectionServiceSpy = spy(cargoinspectionService);
    donothing().when(cargoinspectionServiceSpy).inspectCargo(eq(new TrackingId("AAA")));

    // some real actions.

    verify(cargoinspectionServiceSpy,atLeastOnce()).inspectCargo(any(TrackingId.class));
 
}

根本没有模拟/监视对象的交互。

解决方法

为此目的有一个 Arquillian 扩展:https://github.com/topikachu/arquillian-extension-mockito/

假设 Maven:

<dependency>
  <groupId>org.jboss.arquillian.extension</groupId>
  <artifactId>arquillian-mockito</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
</dependency>

然后您可以使用扩展程序的 @Spy 注释来监视服务:

@Inject @Spy CargoInspectionService cargoInspectionService;


@Test
public void testCargoWasHandled(){
    doNothing().when(cargoInspectionService).inspectCargo(eq(new TrackingId("AAA")));

    // some real actions.

    verify(cargoInspectionService,atLeastOnce()).inspectCargo(any(TrackingId.class));
 
}