Java 在Objectify中注册实体在测试用例期间出现问题
我们有一个使用Objectify4和Spring3.1开发的项目,并在GAE上部署和运行,我们使用IDE作为STS 当我使用Maven(cmdJava 在Objectify中注册实体在测试用例期间出现问题,java,spring,objectify,Java,Spring,Objectify,我们有一个使用Objectify4和Spring3.1开发的项目,并在GAE上部署和运行,我们使用IDE作为STS 当我使用Maven(cmdmvn install)在本地构建项目时,测试用例失败并引发以下异常 从异常中,我观察到它在测试类classunittest中注入classservice服务类时失败(这不仅在这个测试类中,而且在每个测试类中,无论我们注入扩展AbstractBaseImpl的任何服务类,它都会给出相同的异常) 在异常stacktrace中,我看到它指向在AbstractB
mvn install
)在本地构建项目时,测试用例失败并引发以下异常
从异常中,我观察到它在测试类classunittest
中注入classservice
服务类时失败(这不仅在这个测试类中,而且在每个测试类中,无论我们注入扩展AbstractBaseImpl
的任何服务类,它都会给出相同的异常)
在异常stacktrace中,我看到它指向在AbstractBaseImpl
中注册实体类(EntityClassA)的行。
在Entitiy类EntityClassA
中,我们使用了@Mapify
,如果我删除实体类中的@Mapify
注释,测试用例将在没有任何bean初始化问题的情况下运行。
我试着从STS和command构建项目,但仍然遇到同样的问题
从功能的角度来看,如果我在构建时跳过测试用例,那么应用程序运行良好。任何人都可以看到实体定义了@Mapify
,并且在测试用例中注册时出现了类似问题
谢谢你的时间
以下是详细情况
EntityClassA.java
@Entity
public class EntityClassA {
@Index @Mapify( ChildClassAMapper.class )
private Map<Integer, ChildClassA> intervalToReward = new LinkedHashMap<>();
@Embed
public static class ChildClassA extends ClassA {
private static final long serialVersionUID = 49769454099624971L;
private int …;
private long …;
public ChildClassA( ) {
…..
}
}
public static class ChildClassAMapperMapper implements Mapper<Integer, ChildClassA> {
@Override
public Integer getKey( ChildClassA value ) {
return value.getInterval();
}
}
}
@Component
public abstract class AbstractBaseImpl implements BaseService {
static {
Line-12 ObjectifyService.register( EntityClassA.class );
}
}
@Service
@Slf4j
public class Class1ServiceImpl extends AbstractBaseImpl implements Class1Service {
// method to store data using objectify..
}
@ContextConfiguration(
locations = { "classpath*:META-INF/spring/core-applicationContext.xml" } )
@RunWith( SpringJUnit4ClassRunner.class )
public abstract class CoreBaseTest {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy(),
new LocalBlobstoreServiceTestConfig(),
new LocalTaskQueueTestConfig(),
new LocalMemcacheServiceTestConfig() );
}
public class Class1UnitTest extends CoreBaseTest {
@Resource( name = "class1Service" )
private Class1Service class1Service;
//Testcases…
}
ChallengeServiceImpl.java
@Entity
public class EntityClassA {
@Index @Mapify( ChildClassAMapper.class )
private Map<Integer, ChildClassA> intervalToReward = new LinkedHashMap<>();
@Embed
public static class ChildClassA extends ClassA {
private static final long serialVersionUID = 49769454099624971L;
private int …;
private long …;
public ChildClassA( ) {
…..
}
}
public static class ChildClassAMapperMapper implements Mapper<Integer, ChildClassA> {
@Override
public Integer getKey( ChildClassA value ) {
return value.getInterval();
}
}
}
@Component
public abstract class AbstractBaseImpl implements BaseService {
static {
Line-12 ObjectifyService.register( EntityClassA.class );
}
}
@Service
@Slf4j
public class Class1ServiceImpl extends AbstractBaseImpl implements Class1Service {
// method to store data using objectify..
}
@ContextConfiguration(
locations = { "classpath*:META-INF/spring/core-applicationContext.xml" } )
@RunWith( SpringJUnit4ClassRunner.class )
public abstract class CoreBaseTest {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy(),
new LocalBlobstoreServiceTestConfig(),
new LocalTaskQueueTestConfig(),
new LocalMemcacheServiceTestConfig() );
}
public class Class1UnitTest extends CoreBaseTest {
@Resource( name = "class1Service" )
private Class1Service class1Service;
//Testcases…
}
CoreBaseTest.java
@Entity
public class EntityClassA {
@Index @Mapify( ChildClassAMapper.class )
private Map<Integer, ChildClassA> intervalToReward = new LinkedHashMap<>();
@Embed
public static class ChildClassA extends ClassA {
private static final long serialVersionUID = 49769454099624971L;
private int …;
private long …;
public ChildClassA( ) {
…..
}
}
public static class ChildClassAMapperMapper implements Mapper<Integer, ChildClassA> {
@Override
public Integer getKey( ChildClassA value ) {
return value.getInterval();
}
}
}
@Component
public abstract class AbstractBaseImpl implements BaseService {
static {
Line-12 ObjectifyService.register( EntityClassA.class );
}
}
@Service
@Slf4j
public class Class1ServiceImpl extends AbstractBaseImpl implements Class1Service {
// method to store data using objectify..
}
@ContextConfiguration(
locations = { "classpath*:META-INF/spring/core-applicationContext.xml" } )
@RunWith( SpringJUnit4ClassRunner.class )
public abstract class CoreBaseTest {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy(),
new LocalBlobstoreServiceTestConfig(),
new LocalTaskQueueTestConfig(),
new LocalMemcacheServiceTestConfig() );
}
public class Class1UnitTest extends CoreBaseTest {
@Resource( name = "class1Service" )
private Class1Service class1Service;
//Testcases…
}
classunittest.java
@Entity
public class EntityClassA {
@Index @Mapify( ChildClassAMapper.class )
private Map<Integer, ChildClassA> intervalToReward = new LinkedHashMap<>();
@Embed
public static class ChildClassA extends ClassA {
private static final long serialVersionUID = 49769454099624971L;
private int …;
private long …;
public ChildClassA( ) {
…..
}
}
public static class ChildClassAMapperMapper implements Mapper<Integer, ChildClassA> {
@Override
public Integer getKey( ChildClassA value ) {
return value.getInterval();
}
}
}
@Component
public abstract class AbstractBaseImpl implements BaseService {
static {
Line-12 ObjectifyService.register( EntityClassA.class );
}
}
@Service
@Slf4j
public class Class1ServiceImpl extends AbstractBaseImpl implements Class1Service {
// method to store data using objectify..
}
@ContextConfiguration(
locations = { "classpath*:META-INF/spring/core-applicationContext.xml" } )
@RunWith( SpringJUnit4ClassRunner.class )
public abstract class CoreBaseTest {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy(),
new LocalBlobstoreServiceTestConfig(),
new LocalTaskQueueTestConfig(),
new LocalMemcacheServiceTestConfig() );
}
public class Class1UnitTest extends CoreBaseTest {
@Resource( name = "class1Service" )
private Class1Service class1Service;
//Testcases…
}
核心应用程序上下文.xml
例外情况
TestCrud(test.core.Class1UnitTest') Time elapsed: 0.163 sec <<< ERROR!
TestCrud(test.core.classunittest')经过的时间:0.163秒ChildClassA是否也包含一个集合,因此您正在尝试嵌套两个嵌入式集合?看起来像是从stacktrace那里找到的。这在Objectify4中是不可能的。我强烈建议升级到5。这个问题缺少最重要的线索-stacktrace:)添加了stacktrace。感谢您的回复,我们在“ChildClassA”中没有使用任何集合,我们有字段“@EmbedMap private Map helperIdToQty=new HashMap();”在超类“ClassA”中,但我尝试删除此字段,并检查它是否仍然给出相同的异常。正如我所说,只有在构建(mvn安装)时运行测试用例时才会发生这种情况。我很惊讶应用程序功能没有抛出任何类似的异常,实体读/写操作也没有按预期工作。请尝试将其归结为一个没有任何spring内容的最小测试用例。使用Objectify5,您可能还会收到更好的错误消息。