【问题标题】:How to use ObjectifyService in Junit Testing如何在 Junit 测试中使用 ObjectifyService
【发布时间】:2015-12-14 04:37:20
【问题描述】:

如果你想使用数据存储服务来执行 junit 测试,这就是你要做的

LocalServiceTestHelper helper =
        new LocalServiceTestHelper(new LocalMemcacheServiceTestConfig(),new LocalDatastoreServiceTestConfig());

@Before
public void setUp() {
helper.setUp();
} 

@After
public void tearDown() {
helper.tearDown();
}

@Test
public void testInsert1() {
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
assertEquals(0, ds.prepare(new  Query("yam")).countEntities(withLimit(10)));
ds.put(new Entity("yam"));
ds.put(new Entity("yam"));
assertEquals(2, ds.prepare(new  Query("yam")).countEntities(withLimit(10)));
}

我已经使用 objectify 尝试了上述测试

Public class myofyTest{

@Entity
private class Food{
@id Long id;
String foodtype;

public Food(String food){
 foodtype = food ;
}

}

static{
ObjectifyService.register(Food.class);
}

LocalServiceTestHelper helper = new LocalServiceTestHelper
(new LocalMemcacheServiceTestConfig(),new LocalDatastoreServiceTestConfig());

@Before
public void setUp() {
helper.setUp();
} 

@After
public void tearDown() {
helper.tearDown();
}

@Test
public void testInsert1() {
Food food = new Food("yam");
ofy().save().entities(food).now();

}
}

但是我遇到了这种异常

java.util.ServiceConfigurationError: com.google.appengine.tools.development.
LocalRpcService: Provider com.google.appengine.api.datastore.dev.
LocalCloudDatastoreV1Service could not be instantiated

您如何使用 ObectifyService 而不是 DatastoreService 实现这种测试?

【问题讨论】:

    标签: java google-app-engine junit objectify


    【解决方案1】:

    您可能忘记添加所需的依赖项。

    这是针对您的问题的有效测试:

    import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
    import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
    import com.googlecode.objectify.ObjectifyFactory;
    import com.googlecode.objectify.ObjectifyService;
    import com.googlecode.objectify.annotation.Entity;
    import com.googlecode.objectify.annotation.Id;
    import com.googlecode.objectify.annotation.Index;
    import com.googlecode.objectify.cache.AsyncCacheFilter;
    import com.googlecode.objectify.util.Closeable;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    import static com.piyasatakip.backend.OfyService.ofy;
    import static junit.framework.Assert.assertNotNull;
    
    /**
     * Created by devrimtuncer on 27/03/16.
     */
    public class ObjectifyServiceTest {
    
    
        private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
    
        protected Closeable session;
    
        @BeforeClass
        public static void setUpBeforeClass() {
            // Reset the Factory so that all translators work properly.
            ObjectifyService.setFactory(new ObjectifyFactory());
            ObjectifyService.register(Food.class);
        }
    
        @Before
        public void setUp() {
            this.session = ObjectifyService.begin();
            this.helper.setUp();
        }
    
        @After
        public void tearDown() {
            AsyncCacheFilter.complete();
            this.session.close();
            this.helper.tearDown();
        }
    
        @Test
        public void doTest() {
            Food food = new Food("yam");
    
            // 1) save food to data store
            ofy().save().entity(food).now();
    
            // 2) retrieve food from data store
            Food foodRetrieved = ofy().load().type(Food.class).filter("foodtype", "yam").first().now();
    
            assertNotNull(foodRetrieved);
        }
    
        @Entity
        private class Food {
            @Id
            Long id;
    
            @Index
            String foodtype;
    
            public Food(String food) {
                foodtype = food;
            }
        }
    }
    

    不要忘记添加所需的依赖项。

    即 build.gradle 中的依赖项:

    dependencies {
        appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.34'
        compile 'com.google.appengine:appengine-endpoints:1.9.34'
        compile 'com.google.appengine:appengine-endpoints-deps:1.9.34'
        compile 'com.google.appengine:appengine-api-1.0-sdk:1.9.34'
    
        compile 'com.googlecode.objectify:objectify:5.1.12'
    
        compile 'javax.servlet:servlet-api:2.5'        
        compile 'org.jsoup:jsoup:1.7.2'
    
        testCompile 'com.google.appengine:appengine-testing:1.9.34'
        testCompile 'com.google.appengine:appengine-api-stubs:1.9.34'
        testCompile 'junit:junit:4.4'
    }
    

    【讨论】:

    • 我收到 2 个错误。无法解析 ObjectifyService.begin() 中的方法 begin() 和检索食物代码中的方法 doTest 中的方法,在此位置收到错误无法访问 com.google.appengine.api.datastore.QueryResultIterable ....ofy().load().....
    • @gikarasojo kinene 你检查过我分享的所有依赖项了吗?
    【解决方案2】:

    我注意到您的 setup() 中没有以下行

    Closable session;
    session = ObjectifyService.begin()
    

    您还需要在您的 tearDown() 中的 helper.tearDown() 之前使用它:

    session.close();
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多