小编Itc*_*chy的帖子

如何测试 java.net.http (Java 11) 请求 BodyPublisher?

我正在尝试测试使用新 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)

在我的测试中,我模拟HttpClientjava.net.http.HttpRequest. 如何获取/测试其请求正文(= my "example")?我可以打电话request.bodyPublisher()来获取HttpRequest.BodyPublisher,但后来我被卡住了。

  • 我试图将它转换为jdk.internal.net.http.RequestPublishers.ByteArrayPublisher(它实际上是),但它不会编译,因为模块没有导出相应的包。
  • 我已经检查了HttpRequest.BodyPublisher-interface ( .contentLength(), .subscribe(subscriber)) 中的可用方法,但我想它们是不可能的。
  • 我试图只创建一个新的BodyPublisher并使用 比较它们.equals(),但没有真正的实现,所以比较总是错误的。

java java-http-client java-11

8
推荐指数
1
解决办法
2534
查看次数

使用测试代码修补 Java 9 模块以使用反射

如何在测试运行时将我的测试添加到我的生产代码中,以便它们都在同一个 Java 9 模块中并且可以使用反射相互访问?

到目前为止我已经尝试过:

  • 删除 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)

我在一个包含以下子目录和文件的目录中:

  • ModuleInfoExample/module-info.class
  • ModuleInfoExample/com/stackoverflow/examplepackage/Main.class
  • ModuleInfoTest/com/stackoverflow/examplepackage/AnyClass.class

我正在使用:

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 问题中 …

java java-9 java-module

7
推荐指数
1
解决办法
218
查看次数

Play Framework范本中的有界通用参数

如何在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一个编译错误。

scala playframework-2.3

5
推荐指数
1
解决办法
492
查看次数

Java 9 模块化应用程序中的 Logback 不起作用

我有一个使用 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?

java logback slf4j java-9 java-module

5
推荐指数
2
解决办法
3349
查看次数

FakeApplication使用特定的application.conf?

如何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 playframework-2.0

2
推荐指数
1
解决办法
4428
查看次数

闪烁的 HttpClient 有时会抛出 IOException

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)

奇怪的是,这取决于我的请求的速度:

  • 每 5 秒请求一次:30% 失败
  • 每 3 秒请求一次:0% 失败

我为它写了一个测试:

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在命令行上执行相同的操作。无论我尝试什么时间间隔,都没有请求失败。所以应该不是服务器的问题。
  • 并行运行多次测试。5 秒间隔仍然失败(然后并行多次)。所以应该不是服务器的问题。
  • HttpClient.newHttpClient() …

java-http-client java-19

0
推荐指数
1
解决办法
1356
查看次数