java - Google AppEngine 运行时中的模拟

标签 java google-app-engine mockito

我正在尝试在 GAE 运行时中做一些需要“模拟”的事情:

  private Mongo createMongo() {
    Mongo mongo = Mockito.mock(Mongo.class);
    ...
  }

但是,这显然会导致错误,因为“反射”是一个受限类:

java.lang.NoClassDefFoundError: sun.reflect.ReflectionFactory is a restricted class. Please see the Google  App Engine developer's guide for more details.
    at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
    at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.<init>(SunReflectionFactoryInstantiator.java:24)
    at org.objenesis.strategy.StdInstantiatorStrategy.newInstantiatorOf(StdInstantiatorStrategy.java:65)
    at org.objenesis.ObjenesisBase.getInstantiatorOf(ObjenesisBase.java:76)
    at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)
    at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:111)
    at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:51)
    at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:52)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:41)
    at org.mockito.Mockito.mock(Mockito.java:1014)
    at org.mockito.Mockito.mock(Mockito.java:909)
  • 有解决办法吗?有没有办法让“反射(reflection)” 使用 GAE 运行时?
  • 是否有 sun.reflect 的“仿真”库这使得反射(reflection)成为可能?
  • 也许,定义哪些类可能被反射(reflect)?喜欢@Reflectable或者什么东西
  • 或者已经存在一个可在 AppEngine 中运行的 Mock 框架?

更新:

早在 2010 年我就发现了一个类似的问题:

https://groups.google.com/forum/?fromgroups=#!topic/google-appengine-java/uIWRftGl-fA

但是到目前为止还没有答案。

最佳答案

App Engine 应用程序在沙箱中运行,这限制了它们的功能。沙盒的概述可以在这里找到:

https://cloud.google.com/appengine/docs/java/#Java_The_sandbox

沙箱限制之一是对应用程序可以访问的 jre 捆绑类的限制。此处列出了允许应用程序访问的 jre 捆绑类的完整列表:

https://cloud.google.com/appengine/docs/java/jrewhitelist

为什么 ReflectionFactory 本身不在这个可访问类的列表中?好吧,如果您阅读此类的 javadoc,您会发现以下声明:“此类中的方法非常不安全,可能会导致语言和 validator 的颠覆。”所以,这个类可以用来破坏沙箱。

关于java - Google AppEngine 运行时中的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727135/

相关文章:

java - 我不明白为什么这个简单的语句不起作用

java - 访问 TestRule 中的自定义注释

arrays - Python 数组 JSON(转储)

java - 了解 Java API 中 AppEngine 键名的最大长度

java - 如何使用mockito检查是否删除了正确的文件

java - 什么是NullPointerException,我该如何解决?

java - Java 中的 Google App Engine 编码 key

java - 是否可以在java流中使用when()初始化模拟

java - 验证方法调用而不在 Spy 上执行其实际实现

java - 在 Java 中将 JSON 响应转换为字符串?