我正在使用Quarkus中的MicroProfile REST客户端,想知道如何对自定义客户端接口进行单元测试?
示例服务:
@Path("/v1")
@RegisterRestClient
public interface CustomService {
@POST
@Path("/custom")
void postCustomObject(CustomObject object);
}
是否可以编写包含此功能的单元测试?例如。我想测试请求主体是否得到了正确的处理,是否包含了正确的JSON(特别是因为我遇到了JVM和本机映像模式之间行为不同的问题)。
REST服务器资源可以很容易地用REST保证测试,但是我没有发现REST客户机接口有类似的情况。
有什么建议吗?
有点晚了,但我试着回答这个问题,以供将来参考。虽然我同意@héctor的评论,但测试MicroProfile rest客户机本身(例如,实际测试错误处理程序)或在rest客户机注入的bean中测试可能会很有用。
无论如何,您需要一个模拟服务器,如Wiremock。Quarkus的官方指南实际上涵盖了这个主题。我可以在这里报告一个例子(我从这里拿来的)。
将此依赖项添加到您的pom.xml中(如果您使用的是Maven):
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8</artifactId>
<scope>test</scope>
<version>${wiremock.version}</version>
</dependency>
package org.acme.getting.started.country;
import java.util.Collections;
import java.util.Map;
import com.github.tomakehurst.wiremock.WireMockServer;
import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
public class WiremockCountries implements QuarkusTestResourceLifecycleManager {
private WireMockServer wireMockServer;
@Override
public Map<String, String> start() {
wireMockServer = new WireMockServer();
wireMockServer.start();
//define a static response when the request matches a url declared as a regex
stubFor(get(urlEqualTo("/v2/name/GR"))
.willReturn(aResponse()
.withHeader("Content-Type", "application/json")
//read the WireMock docs: you can even use a json file in /resources/__files/ (default expected location) in place of a string
.withBody(
"""
[
{
"name": "Ελλάδα",
"capital": "Αθήνα"
}
]
"""
)));
//remap the base url of the external service to the base url of the mock server
return Collections.singletonMap("org.acme.getting.started.country.CountriesService/mp-rest/url", wireMockServer.baseUrl());
}
@Override
public void stop() {
if (null != wireMockServer) {
wireMockServer.stop();
}
}
}
package org.acme.getting.started.country;
import javax.inject.Inject;
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
@QuarkusTest
@QuarkusTestResource(WiremockCountries.class)
class RegularCountriesServiceTest {
@Inject
@RestClient
CountriesService countriesService;
@Test
void testGR() {
// assertThat(countriesService.getByName("GR")).hasSize(10).extracting("name").contains("Greece");
assertThat(countriesService.getByName("GR")).hasSize(1).extracting("name").contains("Ελλάδα");
}
}
如果您想要测试rest客户机,那么您所需要做的就是重用mock服务器的包装器类,并用@inject注入这个bean,该bean声明rest客户机为其依赖项。做这样的事情:
@QuarkusTest
@QuarkusTestResource(WiremockWrapperAsBefore.class)
class MyBusinessClassTest {
@Inject
MyBusinessClass myBusinessClass;
@Test
void testMyRestCleintInjectedIntoMyBusinessClass() {
ResponseDTO dto = myBusinessClass.methodWhichCallsMyMicroProfileRestClient(String someParam);
assertNotNull(dto);
}
}
否则,在其他场景中,使用RestClientBuilder为MicroProfile rest客户端接口创建代理实现可能很有用,如下所示:
import java.net.MalformedURLException;
import java.net.URI;
import org.eclipse.microprofile.rest.client.RestClientBuilder;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
public class RestClientTest {
@Test
public void init() throws MalformedURLException {
URI baseURI = URI.create("http://localhost:8080");
PingClient client = RestClientBuilder.newBuilder().
baseUri(baseURI).
build(PingClient.class);
assertNotNull(client);
String result = client.ping();
assertNotNull(result);
}
}
对应的界面很容易猜到,但如下所示:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
@Path("/restclient/resources/ping")
@RegisterRestClient
public interface PingClient {
@GET
String ping();
}
在这种情况下,如果您使用的是Quarkus,您将不需要以下依赖项,但如果有人使用的是MicroProfile,而不是Quarkus,我将从上面的链接报告这些依赖项:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-mp-client</artifactId>
<version>3.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
客户端测试更多关心客户端方面的代码执行情况,通常是web浏览器或者浏览器插件。区别于服务器端,代码在客户端执行并直接返回随后的结果。 下列文章描述了如何进行客户端的web应用测试: 基于DOM跨站脚本测试 (OTG-CLIENT-001) JavaScript脚本执行测试 (OTG-CLIENT-002) HTML注入测试 (OTG-CLIENT-003) 客户端URL重定向测试 (OTG-CLI
有的公司开发的系统没有前端/客户端,接口测试是如何测试的呢?也是跟web接口测试/app接口测试一样吗?传输数据也是使用http协议吗?(因为现在看到网上的课程大多都是讲解http协议传输数据的,其他基本没怎么讲解) 希望知道的小伙伴回答一下,十分感谢
我已经在CentOS上安装了SQLPLUS瘦客户端。通过客户端,我试图与Oracle 12c建立TCPS连接。但是当我使用以下命令时,我得到“ORA-28759:打开文件失败”异常。然而,当我使用传输控制协议时,它工作正常。 这不起作用:sudo-sqlplus-s“user/pwd002@(描述=(地址=(协议=TCPS)(端口=1522)(主机=test.co.uk))(连接数据=(服务名称=
当我再次调用时,第二次调用将按预期返回。但我想明白,为什么第一次打电话成功了?我是否遗漏了某些特定于TCP的细节?这种奇怪的(对我来说)行为只针对{活动,错误}连接。
我使用Retrofit为我的REST API实现了一个Java客户端。客户端是一个简单的java应用程序,而不是Android应用程序。如何为我的Java客户端编写单元测试?以下是我的服务类之一。
客户端接入 积分商城是纯H5页面形式的,开发者客户端集成兑吧积分商城的方法是,直接在自己app的webview加载积分商城H5页面。 H5接入 开发者客户端接入,加载积分商城页面时,请务必做到以下几点,以保证积分兑换的用户体验。 保证webview可以自行适应页面:对接联调时需测试商城首页、商品详情页、活动页内容是否适配正常; Android应用下,为了用户兑换优惠券之后可以方便的去使用,请设置W