我写了一堆实体。我正在尝试对其进行测试。我在与此非常相似的实体上遇到问题,但是当我清理构建时,问题突然消失了。然后,我开始为SetMap编写类似的测试,然后.....相同的问题。我99.9999%的人确定我只会保留100个SetMap。但是,我的测试表明下面的代码中有101个查询。
我觉得这些测试很烂。有人可以给我一些有关单元测试实体类的指导吗?我到底应该测试什么?我坚持他们之后才存在?
为什么,为什么,为什么在下面的测试方法中返回101个SetMap。怎么...为什么... =-[
每次编译时都会出现此错误:
89 persistence-test WARN [main] openjpa.Runtime-在以下资源“ [file:/ home / matt / Code / vox / vox-lib / vox-lib-common”中多次发现了持久性单元“ persistence-test” /vox-entity/target/classes/META-INF/persistence.xml,文件:/ home / matt / Code / vox / vox-lib / vox-lib-common / vox-entity / src / main / resources / META- INF / persistence.xml]”,但持久性单元名称应该是唯一的。正在使用与“文件:/home/matt/Code/vox/vox-lib/vox-lib-common/vox-entity/target/classes/META-INF/persistence.xml”中提供的名称匹配的第一个持久性单元。
202持久性测试INFO [main] openjpa.Runtime-启动OpenJPA 2.1.1
448持久性测试信息[main] openjpa.jdbc.JDBC-使用字典类“ org.apache.openjpa.jdbc.sql.DerbyDictionary”。
我的src / main / resources / META-INF文件夹中肯定只有一个persistence.xml。
我正在使用Maven。 Maven是否有可能在某处复制某些东西?
public class SetMapTest {
private static EntityManagerFactory emf;
private static EntityManager em;
private static EntityTransaction tx;
@BeforeClass
public static void initEntityManager() throws Exception {
emf = Persistence.createEntityManagerFactory("persistence-test");
em = emf.createEntityManager();
}
@AfterClass
public static void closeEntityManager() throws SQLException {
em.close();
emf.close();
}
@Before
public void initTransaction() {
tx = em.getTransaction();
}
@Test
public void testSomeMethod() {
// check that nothing is there
String s = "SELECT x FROM SetMap x";
Query q = em.createQuery(s);
List<SetMap> qr = q.getResultList();
assertEquals(0, qr.size());
int count = 100;
// util method that returns setMaps where setMap.title = 'title:i'
// where 0 <= i < count
ArrayList<SetMap> setMaps = TestUtil.getNumberedSetMapList(count);
assertEquals(setMaps.size(), count);
VoxUser author = TestUtil.getNumberedVoxUser(0);
SetPatternMap setPatternMap = TestUtil.getNumberedSetPatternMap(0);
setPatternMap.setAuthor(author);
author.addSetPatternMap(setPatternMap);
tx.begin();
em.persist(author);
em.persist(setPatternMap);
Iterator<SetMap> iter = setMaps.iterator();
while(iter.hasNext()){
SetMap setMap = iter.next();
em.persist(setMap);
setMap.setAuthor(author);
author.addSetMap(setMap);
setMap.setSetPatternMap(setPatternMap);
setPatternMap.addSetMap(setMap);
}
tx.commit();
String qString = "SELECT x FROM SetMap x";
q = em.createQuery(qString);
qr = q.getResultList();
assertEquals(count, qr.size()); // this is the method that fails
// it claims there are 101 SetMaps in the P.C.
for (int i = 0; i < 1; i++) {
String qt = "SELECT x FROM SetMap x WHERE x.title = 'title:" + i + "'";
q = em.createQuery(qt);
qr = q.getResultList();
assertEquals(1, qr.size());
// i played around with this a little bit. It seems there are two SetMaps
// whose titles are "title:0" I can't figure out how that is....
}
}
}
我的一些util方法:
public static PhraseMap getNumberedPhraseMap(int pos){
PhraseMap phraseMap = new PhraseMap();
phraseMap.setTitle("title:" + pos);
return phraseMap;
}
public static ArrayList<PhraseMap> getNumberedPhraseMapList(int count){
ArrayList<PhraseMap> phraseMaps = new ArrayList<PhraseMap>();
for(int i = 0; i < count; i++){
PhraseMap phraseMap = getNumberedPhraseMap(i);
phraseMaps.add(phraseMap);
}
return phraseMaps;
}
请帮忙!
最佳答案
我的肯定只有一个persistence.xml
src / main / resources / META-INF文件夹
谁说没有? Maven说其中有一个
/home/matt/Code/vox/vox-lib/vox-lib-common/vox-entity/target/classes/META-INF/persistence.xml
还有一个
/home/matt/Code/vox/vox-lib/vox-lib-common/vox-entity/src/main/resources/META-INF/persistence.xml
并且这两个都在运行时放在CLASSPATH中(此时您尚未进行编译,也许“编译”是所调用的目标之一,但不在此步骤中)。
因此,请修复您的pom.xml,以免在Maven为您执行某些操作时复制内容。那会(应该)然后删除错误消息