Java 在Objectify中注册实体在测试用例期间出现问题

Java 在Objectify中注册实体在测试用例期间出现问题,java,spring,objectify,Java,Spring,Objectify,我们有一个使用Objectify4和Spring3.1开发的项目,并在GAE上部署和运行,我们使用IDE作为STS 当我使用Maven(cmdmvn install)在本地构建项目时,测试用例失败并引发以下异常 从异常中,我观察到它在测试类classunittest中注入classservice服务类时失败(这不仅在这个测试类中,而且在每个测试类中,无论我们注入扩展AbstractBaseImpl的任何服务类,它都会给出相同的异常) 在异常stacktrace中,我看到它指向在AbstractB

我们有一个使用Objectify4和Spring3.1开发的项目,并在GAE上部署和运行,我们使用IDE作为STS

当我使用Maven(cmd
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,您可能还会收到更好的错误消息。