GAE(Java)高复制数据存储测试-测试用例之间未清除数据存储 总结
在使用appengine的高复制数据存储设置单元测试时,我看到一些奇怪的行为 我在下面举了一个完整的例子。问题在于,一个测试用例中的持久化对象可用于后面的测试用例,但只有在后面的测试用例在事务中检索到它时才可用。据我所知,拆卸方法应该完全清除数据存储 我认为我的设置有问题,或者我遗漏了一些重要的东西。请帮忙 具体问题 鉴于下面的代码,为什么输出如下?(特别是我用粗体显示的最后一行) 2013年9月17日20:41:35 org.datanucleus.PersistenceConfiguration setProperty 信息:属性datanucleus.appengine.SingletonPmforName未知-将被忽略 2013年9月17日20:41:36 com.google.appengine.datanucleus.MetaDataValidator验证 信息:正在为com.test.Thing执行appengine特定的元数据验证 2013年9月17日20:41:36 com.google.appengine.datanucleus.MetaDataValidator验证 信息:已完成对com.test.Thing执行appengine特定元数据验证 2013年9月17日20:41:36 com.google.appengine.api.datastore.dev.LocalDatastoreService init 信息:已初始化本地数据存储: 类型:主/从 存储:在内存中 2013年9月17日20:41:36 com.google.appengine.api.datastore.dev.LocalDatastoreService init 信息:已初始化本地数据存储: 类型:主/从 存储:在内存中 [External TRANSACTION]正确执行此操作 [INSIDE TRANSACTION]不应执行此操作。物品:物品 我的评论 除非我正在做一些非常愚蠢的事情(这是不可能的),否则第一个测试用例中持久化的项目似乎仍然可用于第二个测试用例中的事务 第二个测试用例尝试在事务外部获取ObjectById,并正确抛出异常 然后,它在事务中尝试相同的操作,并检索一个对象,我认为该对象只能是先前测试用例中持久化的对象 为什么会这样?我做错了什么?非常感谢 复制问题的代码 我在Eclipse中创建了一个新的Web应用程序项目,并将此屏幕截图中显示的类和JAR添加到该项目中: 类PMF如下所示:GAE(Java)高复制数据存储测试-测试用例之间未清除数据存储 总结,java,unit-testing,google-app-engine,google-cloud-datastore,datanucleus,Java,Unit Testing,Google App Engine,Google Cloud Datastore,Datanucleus,在使用appengine的高复制数据存储设置单元测试时,我看到一些奇怪的行为 我在下面举了一个完整的例子。问题在于,一个测试用例中的持久化对象可用于后面的测试用例,但只有在后面的测试用例在事务中检索到它时才可用。据我所知,拆卸方法应该完全清除数据存储 我认为我的设置有问题,或者我遗漏了一些重要的东西。请帮忙 具体问题 鉴于下面的代码,为什么输出如下?(特别是我用粗体显示的最后一行) 2013年9月17日20:41:35 org.datanucleus.PersistenceConfigurati
package com.test;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PMF() {}
public static PMF getInstance() {
if (null == _instance) {
_instance = new PMF();
}
return _instance;
}
public static PersistenceManagerFactory get() {
return pmfInstance;
}
private static PMF _instance;
}
package com.test;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
@PersistenceCapable
public class Thing {
public Thing(String item) {
this.item = item;
this.key = makeKey(item);
}
public static Key makeKey(String item) {
return KeyFactory.createKey("Thing", item);
}
public String getId() {
if (null == key) {
return null;
}
return KeyFactory.keyToString(key);
}
public String getItem() {
return item;
}
public String toString() {
return "THING:" + item;
}
@PrimaryKey
@Persistent
private Key key;
@Persistent
private String item;
}
package com.test;
import javax.jdo.PersistenceManager;
import javax.jdo.Transaction;
import junit.framework.TestCase;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
public class TestDatastore extends TestCase {
@Override
public void setUp() {
helper.setUp();
}
@Override
public void tearDown() {
helper.tearDown();
}
public void testCreateThing() {
String item = "item";
Thing thing = new Thing(item);
PersistenceManager pm = PMF.get().getPersistenceManager();
Thing persisted = pm.makePersistent(thing);
Thing result = pm.getObjectById(Thing.class, persisted.getId());
assertEquals(item, result.getItem());
}
public void testThingDoesntExist() {
String item = "item";
Thing thing = new Thing(item);
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
Thing testThing = pm.getObjectById(Thing.class, Thing.makeKey(thing.getItem()));
} catch (Exception e) {
System.out.println("[OUTSIDE TRANSACTION] This correctly gets executed.");
}
try {
tx.begin();
Thing testThing = pm.getObjectById(Thing.class, Thing.makeKey(thing.getItem()));
System.out.println("[INSIDE TRANSACTION] This should not be executed. " + testThing);
tx.commit();
} catch (Exception e) {
System.out.println("This doesn't get executed, but it should");
}
}
private final LocalServiceTestHelper helper =
new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig()
.setDefaultHighRepJobPolicyUnappliedJobPercentage(100));
}
课程内容如下所示:
package com.test;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PMF() {}
public static PMF getInstance() {
if (null == _instance) {
_instance = new PMF();
}
return _instance;
}
public static PersistenceManagerFactory get() {
return pmfInstance;
}
private static PMF _instance;
}
package com.test;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
@PersistenceCapable
public class Thing {
public Thing(String item) {
this.item = item;
this.key = makeKey(item);
}
public static Key makeKey(String item) {
return KeyFactory.createKey("Thing", item);
}
public String getId() {
if (null == key) {
return null;
}
return KeyFactory.keyToString(key);
}
public String getItem() {
return item;
}
public String toString() {
return "THING:" + item;
}
@PrimaryKey
@Persistent
private Key key;
@Persistent
private String item;
}
package com.test;
import javax.jdo.PersistenceManager;
import javax.jdo.Transaction;
import junit.framework.TestCase;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
public class TestDatastore extends TestCase {
@Override
public void setUp() {
helper.setUp();
}
@Override
public void tearDown() {
helper.tearDown();
}
public void testCreateThing() {
String item = "item";
Thing thing = new Thing(item);
PersistenceManager pm = PMF.get().getPersistenceManager();
Thing persisted = pm.makePersistent(thing);
Thing result = pm.getObjectById(Thing.class, persisted.getId());
assertEquals(item, result.getItem());
}
public void testThingDoesntExist() {
String item = "item";
Thing thing = new Thing(item);
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
Thing testThing = pm.getObjectById(Thing.class, Thing.makeKey(thing.getItem()));
} catch (Exception e) {
System.out.println("[OUTSIDE TRANSACTION] This correctly gets executed.");
}
try {
tx.begin();
Thing testThing = pm.getObjectById(Thing.class, Thing.makeKey(thing.getItem()));
System.out.println("[INSIDE TRANSACTION] This should not be executed. " + testThing);
tx.commit();
} catch (Exception e) {
System.out.println("This doesn't get executed, but it should");
}
}
private final LocalServiceTestHelper helper =
new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig()
.setDefaultHighRepJobPolicyUnappliedJobPercentage(100));
}
最后,TestDatastore类如下所示:
package com.test;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PMF() {}
public static PMF getInstance() {
if (null == _instance) {
_instance = new PMF();
}
return _instance;
}
public static PersistenceManagerFactory get() {
return pmfInstance;
}
private static PMF _instance;
}
package com.test;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
@PersistenceCapable
public class Thing {
public Thing(String item) {
this.item = item;
this.key = makeKey(item);
}
public static Key makeKey(String item) {
return KeyFactory.createKey("Thing", item);
}
public String getId() {
if (null == key) {
return null;
}
return KeyFactory.keyToString(key);
}
public String getItem() {
return item;
}
public String toString() {
return "THING:" + item;
}
@PrimaryKey
@Persistent
private Key key;
@Persistent
private String item;
}
package com.test;
import javax.jdo.PersistenceManager;
import javax.jdo.Transaction;
import junit.framework.TestCase;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
public class TestDatastore extends TestCase {
@Override
public void setUp() {
helper.setUp();
}
@Override
public void tearDown() {
helper.tearDown();
}
public void testCreateThing() {
String item = "item";
Thing thing = new Thing(item);
PersistenceManager pm = PMF.get().getPersistenceManager();
Thing persisted = pm.makePersistent(thing);
Thing result = pm.getObjectById(Thing.class, persisted.getId());
assertEquals(item, result.getItem());
}
public void testThingDoesntExist() {
String item = "item";
Thing thing = new Thing(item);
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
Thing testThing = pm.getObjectById(Thing.class, Thing.makeKey(thing.getItem()));
} catch (Exception e) {
System.out.println("[OUTSIDE TRANSACTION] This correctly gets executed.");
}
try {
tx.begin();
Thing testThing = pm.getObjectById(Thing.class, Thing.makeKey(thing.getItem()));
System.out.println("[INSIDE TRANSACTION] This should not be executed. " + testThing);
tx.commit();
} catch (Exception e) {
System.out.println("This doesn't get executed, but it should");
}
}
private final LocalServiceTestHelper helper =
new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig()
.setDefaultHighRepJobPolicyUnappliedJobPercentage(100));
}
这看起来很奇怪。
然而,有两件事引起了我的注意:
doh,刚刚注意到这个问题是一年前的:感谢你的关注,Christiaan。