Модульное тестирование JPA - запрос возвращает больше объектов, чем когда-либо существовало - PullRequest
2 голосов
/ 15 января 2012

Я написал кучу сущностей. Я пытаюсь проверить их сейчас. У меня были проблемы с сущностью, очень похожей на эту, но внезапно проблема ушла, когда я очистил сборку. Затем я начал писать аналогичный тест для SetMap, а затем ..... та же проблема. Я на 99,9999% уверен, что только 100 баллов SetMaps. тем не менее, мой тест говорит, что 101 с запросом в коде ниже.

  1. Я чувствую, что эти тесты - отстой. Может кто-нибудь дать мне несколько советов по юнит-тестированию классов сущностей? что именно я должен проверять? просто существует после того, как я их настаиваю?

  2. почему, почему, почему в моем методе тестирования ниже показано 101 SetMaps. Как ... почему ... = - [

  3. Я получаю эту ошибку каждый раз, когда я компилирую:

    89 Персистентный тест WARN [main] openjpa.Runtime - Блок персистентности "Персистентный тест" был найден несколько раз в следующих ресурсах "[file: / home / matt / Code / vox / vox-lib / vox- lib-common / vox-entity / target / classes / META-INF / persistence.xml, файл: / home / matt / код / ​​vox / vox-lib-common / vox-entity / src / main / resources /META-INF/persistence.xml] ", но имена единиц хранения должны быть уникальными. Используется первый блок персистентности, соответствующий указанному имени в «file: /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 тест на постоянство INFO [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....
        }
    }
}

некоторые из моих утилитарных методов:

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;
}

помогите пожалуйста!

1 Ответ

1 голос
/ 15 января 2012

определенно есть только один файл persistence.xml в моем папка src / main / resources / META-INF

Кто сказал, что не было? Maven говорит, что есть один в / дом / матовый / Код / Вокс / Вокс Пб / Вокс Пб-общий / Вокс-объект / цель / классы / META-INF / persistence.xml

и один в / дом / матовый / Код / Вокс / Вокс Пб / Вокс Пб-общий / Вокс-объект / SRC / главная / ресурсы / META-INF / persistence.xml

и оба они находятся в CLASSPATH в время выполнения (в этот момент вы не компилируете, возможно, «компиляция» была одной из вызванных целей, но это не на этом этапе). Так что исправьте свой pom.xml , чтобы не копировать вещи, когда Maven делает что-то для вас. Это будет (должно) затем удалить сообщение об ошибке

...