我正在尝试测试使用新 Java 11 的代码java.net.http.HttpClient。
在我的生产代码中,我有这样的事情:
HttpClient httpClient = ... (gets injected)
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://localhost:1234"))
.POST(HttpRequest.BodyPublishers.ofByteArray("example".getBytes()))
.build();
return httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray());
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我模拟HttpClient了java.net.http.HttpRequest. 如何获取/测试其请求正文(= my "example")?我可以打电话request.bodyPublisher()来获取HttpRequest.BodyPublisher,但后来我被卡住了。
jdk.internal.net.http.RequestPublishers.ByteArrayPublisher(它实际上是),但它不会编译,因为模块没有导出相应的包。HttpRequest.BodyPublisher-interface ( .contentLength(), .subscribe(subscriber)) 中的可用方法,但我想它们是不可能的。BodyPublisher并使用 比较它们.equals(),但没有真正的实现,所以比较总是错误的。如何在测试运行时将我的测试添加到我的生产代码中,以便它们都在同一个 Java 9 模块中并且可以使用反射相互访问?
到目前为止我已经尝试过:
module-info.java)→ 它运行良好,但不是我想要的。--patch-module到其他文件夹几乎增加(到一个指定使用--module-path)→将其与“正常”的代码工作,但不与反射,它没有找到指定的类--module-path。
--patch-module→指定我的测试和生产代码,它只会在我首先指定的文件夹中找到类。--add-opens mymodule/mypackge=mymodule或...=ALL-UNNAMED打开它进行反射 → 看起来没有任何效果。所以我的完整测试线是:
java \
--patch-module com.stackoverflow.examplemodule=ModuleInfoTest:ModuleInfoExample \
--module-path ModuleInfoExample \
--add-opens com.stackoverflow.examplemodule/com.stackoverflow.examplepackage=com.stackoverflow.examplemodule \
--add-opens com.stackoverflow.examplemodule/com.stackoverflow.examplepackage=ALL-UNNAMED \
--module com.stackoverflow.examplemodule/com.stackoverflow.examplepackage.Main
Run Code Online (Sandbox Code Playgroud)
我在一个包含以下子目录和文件的目录中:
我正在使用:
openjdk version "13.0.2" 2020-01-14
OpenJDK Runtime Environment (build 13.0.2+8)
OpenJDK 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
正如我从批准的答案中了解到的那样,我的问题并不是真正的“访问其他课程”,正如我所说的那样。但更像是找到它们(通过扫描类路径/模块路径)。然而,这部分已经在另一个 StackOverflow 问题中 …
如何在Play Framework 2.3 Java项目的Scala模板中使用有界的通用参数?
我目前有类似的东西:
@(entities: List[_ <: Entity], currentEntity: Entity)
<ul>
@for(entity <- entities) {
@if(currentEntity.equals(entity)) {
<li><strong>@entity</strong></li>
} else {
<li>@entity</li>
}
}
</ul>
Run Code Online (Sandbox Code Playgroud)
但是,我可以在entities和中使用不同类型的实体来称呼它,currentEntity这不是很好。我想做类似的事情:
@[T <: Entity](entities: List[T], currentEntity: T)
...
Run Code Online (Sandbox Code Playgroud)
但这给了我Invalid '@' symbol一个编译错误。
我有一个使用 Java 9 的 Maven 项目,并且正在使用模块。Logback 似乎从 1.3.0-alpha1 版本开始就支持这一点,但不幸的是我没有让它工作。
我从 SLF4J 收到以下消息:
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
Run Code Online (Sandbox Code Playgroud)
貌似找不到Logback。并使用检查(由 Jlink 生成)工件,jimage list .../modules除了 logback.xml 配置文件之外,我找不到任何有关 logback 的信息。
也许问题出在我的 module-info.java 中:
open module my.super.app {
requires jackson.annotations;
requires jdk.jsobject;
requires com.fasterxml.jackson.databind;
requires com.fasterxml.jackson.core;
requires javafx.graphics;
requires javafx.controls;
requires org.slf4j;
exports my.super.app;
}
Run Code Online (Sandbox Code Playgroud)
如何以及在哪里声明使用 Java 9 模块依赖 Logback?
如何FakeApplication使用my dev.conf而不是默认值创建运行测试application.conf?
我目前的测试包括以下构造:
Map<String, String> map = new HashMap<>();
map.put("config.file", "/path/to/dev.conf");
FakeApplication fakeApplication = fakeApplication(map);
TestServer testServer = testServer(3333, fakeApplication);
// testServer.start();
running(testServer, HTMLUNIT, new F.Callback<TestBrowser>() {
public void invoke(TestBrowser browser) {
//do something
}
});
Run Code Online (Sandbox Code Playgroud)
从Play Framework文档中改编的关于编写测试的代码会引发以下异常,因为默认情况application.conf不适用于我的开发系统.如果我取消注释,testServer.start();我可以更清楚地看到它.
[WARN] [01/01/2013 18:36:59.505] [pool-4-thread-3] [Dispatchers] Dispatcher [akka.actor.promises-dispatcher] not configured, using default-dispatcher
[WARN] [01/01/2013 18:36:59.521] [play-akka.actor.default-dispatcher-2] [Dispatchers] Dispatcher [akka.actor.actions-dispatcher] not configured, using default-dispatcher
[error] Test test.ApplicationTest.runInBrowser failed: Server is not …Run Code Online (Sandbox Code Playgroud) 我java.net.http.HttpClient.newHttpClient()在 Java 19 (Temurin) 下使用,并sendAsync(...)在同一实例上执行来自不同步骤的请求。我认为这是可以的,正如 javadoc 所说:
一旦构建,HttpClient 就是不可变的......
但是,某些请求会失败并显示以下信息:
java.io.IOException: HTTP/1.1 header parser received no bytes
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这取决于我的请求的速度:
我为它写了一个测试:
private final HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://..."))
.setHeader("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofByteArray("[]".getBytes()))
.build();
@ParameterizedTest
@ValueSource(ints = {3, 5})
void httpClientTest(int intervalSeconds) throws Exception {
HttpClient httpClient = HttpClient.newHttpClient();
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofByteArray()).get();
Thread.sleep(Duration.ofSeconds(intervalSeconds));
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofByteArray()).get();
Thread.sleep(Duration.ofSeconds(intervalSeconds));
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofByteArray()).get();
Thread.sleep(Duration.ofSeconds(intervalSeconds));
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofByteArray()).get();
Thread.sleep(Duration.ofSeconds(intervalSeconds));
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofByteArray()).get();
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过以下操作:
curl在命令行上执行相同的操作。无论我尝试什么时间间隔,都没有请求失败。所以应该不是服务器的问题。HttpClient.newHttpClient() …