2011-06-12 73 views
2

是否可以在Objectify中使用一些模擬框架?Objectify模擬框架?

我試過以下,但它不工作:

Foo mockFoo = mock(Foo.class);  
ObjectifyService.register(mockFoo.getClass()); 
ObjectifyUtil.get().put(mockFoo); 

的錯誤是:

java.lang.IllegalArgumentException: CGLIB$CALLBACK_0: org.mockito.internal.creation.MethodInterceptorFilter is not a supported property type. 
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedSingleValue(DataTypeUtils.java:184) 
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:157) 
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:123) 
    at com.google.appengine.api.datastore.Entity.setProperty(Entity.java:320) 
    at com.googlecode.objectify.impl.save.FieldSaver.setEntityProperty(FieldSaver.java:171) 
    at com.googlecode.objectify.impl.save.LeafFieldSaver.saveValue(LeafFieldSaver.java:93) 
    at com.googlecode.objectify.impl.save.FieldSaver.save(FieldSaver.java:156) 
    at com.googlecode.objectify.impl.save.ClassSaver.save(ClassSaver.java:84) 
    at com.googlecode.objectify.impl.Transmog.save(Transmog.java:342) 
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.toEntity(ConcreteEntityMetadata.java:231) 
    at com.googlecode.objectify.impl.AsyncObjectifyImpl.put(AsyncObjectifyImpl.java:252) 
    at com.googlecode.objectify.impl.AsyncObjectifyImpl.put(AsyncObjectifyImpl.java:229) 
    at com.googlecode.objectify.impl.ObjectifyImpl.put(ObjectifyImpl.java:126) 
    at org.foo.test.ApiTest.bar(ApiTest.java:89) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

我做得不對,或者是這是不可能的?

+0

什麼是你想嘲笑?物化或你堅持的實體?不要認爲第二種情況是可能的,也不能做出很多意義.. – fivanski 2011-06-16 16:24:50

回答

2

在我看來,嘲諷像Objectify一樣大的框架不能依賴Mockito。

public class ProductTest { 
    @Rule 
    public EmbeddedDataStore store = new EmbeddedDataStore(); 

    @Before 
    public void register() { 
    ObjectifyService.register(Product.class); 
    } 

    @Test 
    public void accessObjectifyWithSuccess() { 
    Objectify ofy = ObjectifyService.begin(); 
    ofy.put(new Product()); 
    assertEquals(1, ofy.query(Product.class).list().size()); 
    } 
} 

@Rule在測試之前加載數據存儲。然後,註冊Product類並運行集成測試。

因此,使用這種技術,您可以在不部署應用程序的情況下在App Engine/Objectify上運行測試。

下面的代碼用於編碼數據存儲規則的一種方法:

import org.junit.rules.ExternalResource; 
import com.google.appengine.tools.development.testing.LocalServiceTestHelper; 

public class EmbeddedDataStore extends ExternalResource { 
    private static LocalServiceTestHelper helper; 

    @Override 
    protected void before() throws Throwable { 
    helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig(), 
     new LocalBlobstoreServiceTestConfig(), new LocalTaskQueueTestConfig(), 
     new LocalMemcacheServiceTestConfig()); 
    } 

    @Override 
    protected void after() { 
    helper.tearDown(); 
    } 
} 
+0

GRAVE:收到的異常消除com.google.appengine.tools.development.testing.LocalBlobstoreServiceTestConfig類型的配置 java.lang.NullPointerException – 2012-12-14 14:54:25

+0

您錯過了helper.setUp(); – 2013-07-11 15:29:01