2014-08-27 73 views
1

什么是测试@SequenceGenerator从休眠的方法序列映射和策略是什么?我想确保每个序列都被完美映射,拼写没有错误,并且递增由1完成。是否有任何方法可以为所有序列动态执行此操作?休眠 - 如何测试在JUnit

这里是我的序列映射的示例:

@Column(name = "ADDRESS_ID", nullable = false, precision = 20) 
@Id 
@SequenceGenerator(name = "AddressSeq", sequenceName = "ADDRESS_SEQ", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AddressSeq") 
private Long addressId; 
+0

你想创建一个In内存数据库吗? Hibernate创建序列?或者是外部数据库?您可以使用反射来获取所有序列名称,并查询数据库,但我不认为它是一个单元测试。 – 2014-08-27 21:56:18

+0

Inmemory但Oracle兼容模式与从脚本预加载的模式。你可以在https://github.com/slavisah/mybusiness上看看项目,并用几句话来回顾一下。谢谢 – shx 2014-08-27 22:01:54

+1

我认为你不需要测试序列是否增加1,你需要对hibernate有一定程度的信任,但对于序列名称,你可以使用反射来获得所有映射类,得到它们的id并得到序列的名称,以便将其与原始sql文件进行比较,如果存在“CREATE SEQUENCE”,那么它必须是可靠的。 – 2014-08-27 22:06:12

回答

1

您可以使用this答案,获得你的实体类的列表:

List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>(); 
    classLoadersList.add(ClasspathHelper.contextClassLoader()); 
    classLoadersList.add(ClasspathHelper.staticClassLoader()); 

    reflections = new Reflections(
      new ConfigurationBuilder() 
        .setScanners(new SubTypesScanner(false), 
          new ResourcesScanner()) 
        .setUrls(
          ClasspathHelper.forClassLoader(classLoadersList 
            .toArray(new ClassLoader[0]))) 
        .filterInputsBy(
          new FilterBuilder().include(FilterBuilder 
            .prefix("me.business.model")))); 

并与得到您的DDL:

ClassPathResource cpr = new ClassPathResource("db/schema.sql"); 
    schemaContent = new String(FileCopyUtils.copyToByteArray(cpr 
      .getInputStream())).toLowerCase(); 

并获得每个类的顺序;

private String getSequenceName(Class<?> clazz) { 
    for (Field f : clazz.getDeclaredFields()) { 
     if (f.isAnnotationPresent(SequenceGenerator.class)) { 
      SequenceGenerator sg = f.getAnnotation(SequenceGenerator.class); 
      return sg.sequenceName(); 
     } 
    } 
    return null; 
} 

测试很简单:

Set<Class<?>> entities = reflections.getSubTypesOf(Object.class); 
    for (Class<?> clazz : entities) { 
     String name = getSequenceName(clazz); 
     if (name == null) 
      continue; 
     if (!schemaContent.contains(name.toLowerCase())) { 
      fail("The clazz " + clazz.getSimpleName() 
        + " has a sequence called: " + name 
        + " and it doesn't exits"); 
     } 
    } 

你可以看到它here

如果你想看看它是否工作,在你的entitites之一更改序列名称和运行测试。

+0

不工作。反射无法从给定的包中找到类。列表在测试方法中为空。可能有些安全问题 – shx 2014-08-28 18:01:02

+0

你如何执行这个?在拉请求之前,我用ecilpse在我的电脑中测试。 – 2014-08-28 18:02:22

+0

我在Netbeans中运行它,也会在Eclipse中尝试它。可能是因为JVM版本。 – shx 2014-08-28 18:08:27