将 Spring Boot 2.5 升级到 3.0 时,我遇到了 Wiremock 的一些问题,可能是由于迁移到 jakarta 命名空间所致。即使升级到最新的wiremock-jre8ie 2.35.0(截至 2022 年 12 月)似乎也没有帮助。我收到此错误:
java.lang.NoClassDefFoundError: javax/servlet/DispatcherType
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at com.github.tomakehurst.wiremock.jetty9.JettyHttpServerFactory.getServerConstructor(JettyHttpServerFactory.java:37)
at com.github.tomakehurst.wiremock.jetty9.JettyHttpServerFactory.<clinit>(JettyHttpServerFactory.java:30)
Run Code Online (Sandbox Code Playgroud) 我使用Spring-Cloud-Netflix进行微服务之间的通信.假设我有两个服务,Foo和Bar,而Foo使用Bar的REST端点之一.我使用一个带注释的接口@FeignClient:
@FeignClient
public interface BarClient {
@RequestMapping(value = "/some/url", method = "POST")
void bazzle(@RequestBody BazzleRequest);
}
Run Code Online (Sandbox Code Playgroud)
然后我SomeService在Foo中有一个服务类,它调用了BarClient.
@Component
public class SomeService {
@Autowired
BarClient barClient;
public String doSomething() {
try {
barClient.bazzle(new BazzleRequest(...));
return "so bazzle my eyes dazzle";
} catch(FeignException e) {
return "Not bazzle today!";
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,为了确保服务之间的通信正常工作,我想构建一个测试,使用WireMock之类的东西,对一个假的Bar服务器发出真正的HTTP请求.测试应确保假设正确解码服务响应并报告SomeService.
public class SomeServiceIntegrationTest {
@Autowired SomeService someService;
@Test
public void shouldSucceed() {
stubFor(get(urlEqualTo("/some/url"))
.willReturn(aResponse()
.withStatus(204);
String result = someService.doSomething();
assertThat(result, is("so …Run Code Online (Sandbox Code Playgroud) 我看到在http://wiremock.org/running-standalone.html以独立方式运行时,有关于为wiremock启用详细日志记录的说明(请参阅--verbose).
从java代码启动它时如何启用它?
我正在尝试在我的 Maven 项目上运行单元测试(使用 Wiremock),并观察到以下错误。
java.lang.IllegalStateException: No Server ALPNProcessors
Run Code Online (Sandbox Code Playgroud)
我尝试将以下alpn-boot-8.1.12.v20180117.jar添加到Xbootclasspath
-Xbootclasspath/p:/path/to/alpn-boot-8.1.12.v20180117.jar
Run Code Online (Sandbox Code Playgroud)
并将其放入我的项目目录jvm.config中的文件中.mvn,并通过执行 a 来验证它是否被设置ps -ef | grep Xbootclasspath,但我仍然遇到相同的错误。
它可以在使用Java 8 u191的 Windows 机器上运行,并且无需添加任何内容,但不能在使用Java 8 u181Xbootclasspath的 Linux 上运行
我还尝试将以下依赖项添加到我的pom.xml
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-server</artifactId>
<version>9.4.20.v20190813</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但还是没用。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<workingDirectory>${real.base.dir}</workingDirectory>
<systemProperties>
<log4j.configurationFile>${basedir}/src/test/resources/log4j.xml</log4j.configurationFile>
</systemProperties>
</configuration> …Run Code Online (Sandbox Code Playgroud) 我已经定义了wireMock服务器如下: -
private WireMockServer wireMockServer;
@Before
public void preSetup() throws Exception {
wireMockServer = new WireMockServer(56789);
wireMockServer.start();
};
@Override
@After
public void tearDown() {
wireMockServer.stop();
}
@Test
public void testSendMatchingMessage() throws Exception {
wireMockServer.stubFor(get(urlEqualTo("/orders/v1/ordersearch/"))
.willReturn(aResponse().withStatus(200).withBody("<response>Some content</response>")));
}
Run Code Online (Sandbox Code Playgroud)
但每当我点击下面的网址时
http://0.0.0.0:56789/orders/v1/ordersearch/?field=address%2Cfinance%2Cshipping&limit=10&page=2&q=createdFrom.gt%7E2016-01-11T10%3A12%3A13
Run Code Online (Sandbox Code Playgroud)
我收到以下错误: -
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 404 NOT_FOUND</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /__files/orders/v1/ordersearch/. Reason:
<pre> NOT_FOUND</pre></p><hr /><i><small>Powered by Jetty://</small></i><br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
有人可以让我知道我做错了什么吗?
我已经使用wiremock来测试http调用,但是我当前的工作需要websockets,我想知道是否有人找到/使用了一个库来建立一个本地主机,它将创建一个可以模拟响应的websocket连接.
我用谷歌搜索它,但似乎没有什么是独立的服务器,但只是需要你添加到项目的库.这不起作用,因为我正在寻找可以在所有移动平台/桌面上测试的东西.
到目前为止,我一直在使用SOAPUI进行模拟响应.我的用例很简单:
只是将SOAP XML请求发送到不同的端点(http:// localhost:9001/endpoint1)并获取预设的XML响应.但是MockWrire必须作为独立服务部署到专用服务器上,该服务器将作为模拟响应的中心位置.
只想要一些开始的建议.我可以看到WireMock更适合REST Web服务.所以我的怀疑是:
1)我是否需要将其部署到Java Web服务器或容器以充当始终运行的独立服务.我读到你可以通过使用来剥离
java -jar mockwire.jar --port [port_number]
Run Code Online (Sandbox Code Playgroud)
2)我是否需要使用MockWire API?我需要为我的用例制作课程吗?在我的例子中,请求将通过JUnit测试用例触发以进行模拟.
3)如何实现简单的URL模式匹配?如上所述,我只需要简单的模拟,即在向http:// localhost:9001/endpoint1发出请求时获取响应
4)我的用例是否有更好/更容易的框架?我读到了Mockable,但它对3个团队成员和免费层的演示域有限制.
我面临一个问题,Wiremock 说我的 URL 不匹配,即使它们相同。显然我错过了一些东西。我究竟做错了什么?
WireMock.stubFor(WireMock.get(WireMock.urlPathEqualTo("/test/url?bookingCode=XYZ123&lastName=TEST"))
.willReturn(WireMock.aResponse()
.withStatus(200))
)
Run Code Online (Sandbox Code Playgroud)
下面是控制台日志。
-----------------------------------------------------------------------------------------------------------------------
| Closest stub | Request |
-----------------------------------------------------------------------------------------------------------------------
|
GET | GET
/test/url?bookingCode=XYZ123&lastName=TEST | /test/url?bookingCode=XYZ123&lastName=TEST <<<<< URL does not match
|
|
-----------------------------------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
是因为我没有在匹配器中包含标题吗?
如果是,如何避免匹配标题?无论我发送什么标头,我都希望得到响应。
我在Spring Boot应用程序中使用Wiremock进行测试.我似乎无法使日志记录不输出所有调试日志,这使我的测试运行非常详细.
我看到它在启动时使用SLF4J:
DEBUG wiremock.org.eclipse.jetty.util.log - 通过wiremock.org.eclipse.jetty.util.log.Slf4jLog登录Logger [wiremock.org.eclipse.jetty.util.log]
但是尝试在我的application.properties中配置它,
logging.level.wiremock.org.eclipse = WARN
没有效果,我也设置好了
logging.level.com.github.tomakehurst.wiremock = WARN
但同样,没有效果.由于我正在使用spring-boot-starter-web哪些用途spring-boot-starter-logging,如果我理解正确使用Logback,我也尝试过配置logback-spring.xml,
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="wiremock.org.eclipse" level="INFO"/>
</configuration>
Run Code Online (Sandbox Code Playgroud)
同样,我没有做任何事情阻止Wiremock记录调试级别.我错过了什么?
我们正在编写一个 Spring Boot 应用程序,并使用 Cloud Contract WireMock 支持来存根支持服务。我们的测试类注释如下:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class Tests...
Run Code Online (Sandbox Code Playgroud)
除了一件事之外,这一切都很好:我们发现 Spring Cloud 似乎不会在测试之间重置 WireMock,特别是删除存根,因此测试没有正确隔离。当然,您可以使用@Before包含 a 的方法自己完成此操作reset(),但我们想知道这是否是故意的。是否有一个我们忽略的选项或必须使用的附加注释?
毕竟,不可能在@BeforeClass方法中定义存根,如果总是执行重置,那么存根就会消失,所以我们想知道什么反对开箱即用?
wiremock ×10
java ×6
mocking ×2
spring-boot ×2
feign ×1
logging ×1
soap ×1
spring ×1
spring-cloud ×1
web-services ×1
websocket ×1