我写了一堆实体。我正在尝试对其进行测试。我在与此非常相似的实体上遇到问题,但是当我清理构建时,问题突然消失了。然后,我开始为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为您执行某些操作时复制内容。那会(应该)然后删除错误消息

10-05 22:05