java - 作为 Gradlew 任务运行时,Mockito Spring 测试失败

标签 java spring mockito integration-testing gradlew

我有以下类(class)来测试我的 Spring 应用程序的工作。

此作业借助外部 API 来更新订单对象的状态。

当我刚刚运行该类时,测试成功,但是当我作为 gradlew 任务的一部分运行(运行多个集成测试,包括这个)时,它失败了:

Wanted but not invoked:
client.updateOrder(
    "o11111",
    <Pending order update integration test$$ lambda$ 3 9 9/ 1 6 3 9 3 4 9 4 3 5>
);
-> at OrderUpdateIntegrationTest.shouldSendPendingOrderUpdatesSubmittedOrders(OrderUpdateIntegrationTest.java:77)
Actually, there were zero interactions with this mock.

测试类:

@SpringBootTest(webEnvironment = RANDOM_PORT, classes = TestConfig.class)
@ExtendWith(value = {SpringExtension.class, MockitoExtension.class})
@ActiveProfiles("integration-test")
@DirtiesContext
public class OrderUpdateIntegrationTest {

  private static final String ORDER_ID_1 = "o11111";
  private static final String ORDER_ID_2 = "o22222";
  static VerificationWithTimeout FIVE_SECOND_TIMEOUT = timeout(SECONDS.toMillis(5));

  @Autowired
  private TestScheduleConfigurer testScheduleConfigurer;

  @MockBean
  private OrdersClient client;
  @MockBean
  private UpdatePendingOrdersTasklet updateOrderAndSendEmail;
  @MockBean
  private UrlBuilder urlBuilder;

  @Mock
  private ResponseEntity<Order> mock200HttpResponse;
  @Mock
  private ResponseEntity<String> mockEmail200HttpResponse;

  private Order order11111;
  private Order order22222;
  private OrderList ordersList = new OrderList();

  @Test
  public void shouldSendPendingOrderUpdatesSubmittedOrders() throws Exception {
    order11111 = buildOrder(ORDER_ID_1);
    order22222 = buildOrder(ORDER_ID_2);
    ordersList.setItems(Arrays.asList(order11111, order22222));

    when(client.getPendingOrdersObject(anyString())).thenReturn(ordersList);
    when(client.updateOrder(any(String.class), any(Order.class))).thenReturn(mock200HttpResponse);
    when(mock200HttpResponse.getStatusCode()).thenReturn(HttpStatus.OK);
    when(updateOrderAndSendEmail.postSendEmail(any(JSONObject.class))).thenReturn(mockEmail200HttpResponse);
    when(mockEmail200HttpResponse.getStatusCode()).thenReturn(HttpStatus.OK);

    testScheduleConfigurer.triggerPendingOrderUpdateSchedule();

    verify(client, FIVE_SECOND_TIMEOUT).updateOrder(eq(ORDER_ID_1), argThat(argument -> argument.getState().equals(OrderState.PROCESSING)));
    verify(client, FIVE_SECOND_TIMEOUT).updateOrder(eq(ORDER_ID_2), argThat(argument -> argument.getState().equals(OrderState.PROCESSING)));
    verify(urlBuilder, times(2)).buildComponent("emailNotifications");
  }

  private Order buildOrder(String orderId) {
    Order order = new Order();
    order.setId(orderId);
    order.setSiteId("testSite");
    order.setState(OrderState.SUBMITTED);
    order.setLastModifiedDate("2019-10-20T01:02:03.004Z");

    OrderShippingGroup shippingGroup = new OrderShippingGroup();

    OrderAddress emailAddress = new OrderAddress();
    emailaddress.setemail("test@test.test");
    emailAddress.setFirstName("First Name");
    emailAddress.setLastName("Last Name");

    shippingGroup.setShippingAddress(emailAddress);

    order.setShippingGroups(Arrays.asList(shippingGroup));

    return order;
  }
}

我认为问题是,当我刚刚运行测试时,@MockBean 标记会在上下文中创建一个 OrdersClient 的新实例,因此当 当()verify()方法被调用时,它按预期工作,但如果集成测试作为gradlew任务执行,则作业可能使用与声明的实例不同的实例如@MockBean

有没有办法在这两种情况下使用同一个实例?如果这个假设是正确的。 如果不是,那是哪里出了问题?

谢谢你, 佩德罗。

最佳答案

updateOrder 方法缺少多个模型,因此它使用不同的应用程序配置进行归档。

关于java - 作为 Gradlew 任务运行时,Mockito Spring 测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58766760/

相关文章:

android - 使用 Robolectric 和 Mockito 在 Android 上进行 TDD

java - NiftyGUI的Nifty类无法实例化?

java - 带有 Eclipse 插件的 Java Web 应用程序框架

spring - Spring 是否会在休息 Controller 中为每个请求创建新线程?

java - 尝试在 JBoss EAP 6.3 上部署 spring ws + saaj webapp 时出现 ClassNotFoundException

java - 事务中的结果集

spring - 为什么mockMVC和mockito不能一起工作?

java - 如何在 Spring Boot 中测试对外部 api 的调用

java - 这是在这里返回的匿名对象吗?

java - 如何从众多的swing组件中获取用户版本?