gpt4 book ai didi

java - 在单元测试中启动新的 JVM

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:07 48 4
gpt4 key购买 nike

我有一个类,它是锁定文件。 (见下文。)现在,我有一个单元测试,它断言同一 VM 中的两个线程之间已成功锁定。但是,我实际上让锁在两个虚拟机之间工作。这就提出了一个问题:我如何在单独的进程中启动另一个 JVM?

谢谢,

乔臣

public class FileLocker {
public static interface StreamAccessor {
InputStream getInputStream();
OutputStream getOutputStream();
}
public static void runLocked(File pFile, Consumer<StreamAccessor> pConsumer) {
Function<StreamAccessor,Object> function = (sa) -> { pConsumer.accept(sa); return null; };
callLocked(pFile, function);
}
public static <T> T callLocked(File pFile, Function<StreamAccessor,T> pConsumer) {
try (final RandomAccessFile raf = new RandomAccessFile(pFile, "rw");
final FileChannel channel = raf .getChannel();
final FileLock lock = channel.lock()) {
final StreamAccessor sa = new StreamAccessor() {
@Override
public OutputStream getOutputStream() {
return Channels.newOutputStream(channel);
}

@Override
public InputStream getInputStream() {
return Channels.newInputStream(channel);
}
};
final T t = pConsumer.apply(sa);
return t;
} catch (Throwable thr) {
throw Exceptions.show(thr);
}
}

最佳答案

通过使用 ProcessBuilder,您可以像运行任何其他进程一样执行此操作。参见 here例如。

您“只需”调用另一个运行您的 java 命令的进程,包括所有必需的命令行选项等。棘手的部分可能是确保第二个 JVM 进程在您需要时正确终止。

除此之外:您不应该将其称为单元 测试。 “真正的”单元测试试图模拟/ stub 任何此类依赖关系。从这个角度来看,您正在尝试进行功能/集成测试。或者,当颠倒这个想法时:在单元测试中,你真的不应该使用不同的 JVM。

最后:明确你打算测试什么。您不必测试锁定 本身。这是 JVM 分别由底层操作系统提供给您的功能。验证锁定是否有效是没有意义的。

您应该将单元测试的重点放在验证锁是否在您预期发生时获取和释放。测试锁定的文件是否已锁定……不属于的责任范围(但是对此进行功能测试,只是为了确保您做对了也没有什么坏处)。

关于java - 在单元测试中启动新的 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52739615/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com