模拟Google AppEngine运行时

时间:2013-03-31 06:52:20

标签: 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)
  • 这有什么解决方法吗?有没有办法让“反思” 使用GAE运行时?
  • 是否有sun.reflect的“仿真”库可以进行反射?
  • 或许,要定义哪些类可以反映出来?喜欢@Reflectable或其他
  • 或者已经存在可在AppEngine中运行的Mock框架?

更新:

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

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

但直到现在还没有答案。

1 个答案:

答案 0 :(得分:0)

App Engine应用程序在沙箱中运行,对他们可以执行的操作施加限制。沙箱的概述可以在这里找到:

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

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

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

为什么ReflectionFactory本身不在这个可访问类列表中?好吧,如果您阅读此类的javadoc,您将找到以下语句:&#34;此类中的方法非常不安全,可能导致语言和验证程序的颠覆。&#34;所以,这个类可以用来破坏沙箱。