当前位置: 首页 > 知识库问答 >
问题:

Spock模拟/存根RESTAPI

景岳
2023-03-14

我在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)

共有1个答案

南宫天逸
2023-03-14

我认为,你应该阅读一些基本的Micronaut留档,例如。Micronaut测试-使用Spock测试,尤其是“使用Spock Mocks”部分。就像我在评论中说的,我以前从未使用过Micronaut。但是我能够在10秒内通过谷歌micronaut test mock找到这个。

 类似资料:
  • 本质上,我有一个Java类,它在套接字通道上执行选择,我想存根通道,这样我就可以按预期测试选择工作。 例如,这大致就是被测试的类所做的: 我希望能够测试这样的东西: 这是基于一个真实的例子,但细节并不重要。总体目标是如何存根支持选择的SocketChannel,这样我就不必创建真正的客户机进行测试。 我也知道这比简单地截取SocketChannel更复杂:似乎我需要截取或以某种方式提供自定义系统默

  • 我有一个用注释的Groovy类,因此它得到一个私有的最终字段,我想测试它的用法。我想继续使用,而不是为了启用测试而进一步公开字段。 我正在使用Spock1.0编写测试,并尝试使用Spock的集成、模拟和截尾功能来完成测试。全局截尾可以帮助我截取调用以获得实际的实例,因此我目前的猜测是: 有趣的是,拦截实际上起作用了,确认类实际上获得了名为“dummy”的类型“logger”的对象

  • 这里,在引擎盖下调用。因此,我需要我的模拟实例返回(指示失败的auth),或者在发生意外情况时抛出。 你知道我该怎么做吗?

  • 我用代码编写了以下旧方法,用于访问服务类中的请求对象,例如:

  • 所以我想做一些事情 但我得到了空异常