【发布时间】: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