【发布时间】:2018-08-03 09:10:31
【问题描述】:
我正在 Graal 之上编写一个应用程序,它将能够以不同的语言执行小脚本。
我正在尝试为我用来将 Context.eval() 调用(类型:值)的结果转换/处理为 Java 对象的类编写一些单元测试。我从文档中知道 Value 实例始终绑定到 Context,所以当我尝试编写类似这样的内容时:
@Test
public void NumericFloatTest() throws ScriptExecutionException {
GuestLanguageResultProcessor LangProcessor = new GuestLanguageResultProcessor();
Float javaValue = (float) 43.25;
Value numValue = Value.asValue(javaValue);
LangProcessor.processResult(numValue);
Object result = LangProcessor.processResult(numValue);
assertThat(result.getClass()).isEqualTo(Float.class);
}
我收到以下错误:
java.lang.IllegalStateException: No current context is available. Make sure the Java method is invoked by a Graal guest language or a context is entered using Context.enter().
我想从概念上讲,没有相关的客户代码的“值”实例是没有意义的,所以我的问题是:
如何测试我的 GuestLanguageResultProcessor 类?我是否必须通过创建上下文来“膨胀”我的单元测试?
专家的附加问题:我正在使用这个类 (GuestLanguageResultProcessor) 从多语言值实例中提取 Java 值,以便我可以关闭上下文。换句话说,在我看来,在能够执行 Context.close() 之前,我需要调用 [value instance].asString() 或 .asWhatever() 以获取结果并能够在没有得到一个 IllegalStateException,正如它在 docs 中所说的那样。
我做得对吗?有没有更好的方法来处理获取结果并安全地关闭上下文?
谢谢!
【问题讨论】:
标签: graalvm