【问题标题】:Spock mock/stub rest apiSpock 模拟/存根休息 api
【发布时间】:2021-08-05 12:10:18
【问题描述】:

我在 micronaut 中有以下接口来执行 HTTP POST 请求:

@Client("shoppingCenter")
@SubscriptionKey
interface ApiClient {
  @Post("/shoppingcenter/api/Order")
  OrderResponse createResponse(@Body OrderRequest request);
}

我有一个调用接口的类:

public class OrderService {
  @Inject
  ApiClient apiClient;

  public void sendNewOrder(String item) {
    OrderRequest request = new OrderRequest.builder() 
    // ..builder code
    OrderResponse response = apiClient.createResponse(request);
  }
}

我想在我的 spock 测试中模拟/存根 API 调用,我已经尝试过这种方式:

apiClient.createResponse(request) >> new OrderResponse("orderID")
class OrderServiceSpec extends ApplicationContextSpecification implements RepositoriesFixture, LeakageDetector {
  @Subject
  @Shared
  OrderService OrderService = applicationContext.getBean(OrderService)

  def 'test "sendNewOrder"' (){
    given: 'Item'
    ApiClient apiClient = Stub()
    OrderRequest request = new OrderRequest();
    apiClient.createResponse(request) >> new OrderResponse("orderID")

    when:
    OrderService.sendNewOrder("someItem")

    then:
    noExceptionThrown()

    cleanup:
    //...
  }
} 

但是我得到了错误:

Expected no exception to be thrown, but got 'io.micronaut.discovery.exceptions.NoAvailableServiceException'

    at spock.lang.Specification.noExceptionThrown(Specification.java:118)
    at com.daimler.api.notification.NotificationServiceSpec.test "sendNewOrder"(OrderServiceSpec.groovy:46)
Caused by: io.micronaut.discovery.exceptions.NoAvailableServiceException: No available services for ID: shopping-center
    at io.micronaut.http.client.loadbalance.AbstractRoundRobinLoadBalancer.getNextAvailable(AbstractRoundRobinLoadBalancer.java:50)
    at io.micronaut.core.async.publisher.Publishers$1.doOnNext(Publishers.java:214)

【问题讨论】:

  • 如果你测试 sendNewOrder,apiClient 应该是一个 mock,然后你决定调用 createResponse(request) 返回什么。不知道申请 API 调用是什么意思。
  • 您的问题是什么?什么不工作? any() 来自哪里?你是从 JUnit + Mockito 迁移到 Spock 吗?你应该使用apiClient.createResponse(_)。此外,我看不到您将apiClient 注入OrderService 的位置。当然,该服务仅在您注入模拟时才使用它,因此它知道它。一般来说,发布MCVE 而不是不完整的代码 sn-ps 让人们猜测。我们无法调试我们看不到的东西,您认为重要的不一定是问题的真正所在。
  • @kriegaex 我的问题是,如何模拟 api 调用。 (any() 是错误的,我想我可以用作 mockito,我已经更新了代码)。我已经更新了代码,所以我可以更清楚地理解
  • @TidharKleinOrbach 是的,这是我的问题,如何在 Spock 中模拟 apiClient
  • 如何将 apiClient 注入 OrderService?也许这就是你想要的:spockframework.org/spock/docs/1.3/…

标签: mocking spock micronaut stub


【解决方案1】:

我认为,您应该阅读一些基本的 Micronaut 文档,例如Micronaut Test - Testing with Spock,尤其是“使用 Spock 模拟”部分。就像我在评论中所说的那样,我以前从未使用过 Micronaut。但我可以通过谷歌搜索micronaut test mock 在 10 秒内找到这个。

【讨论】:

  • 是的,我看文档,但我更困惑,因为我有它的示例使用声明性http客户端,但我没有找到任何接口的实现。我应该创建一个实现类,但我应该有什么作为主体......我正在阅读这个主题,因为我很困惑
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多