首页 > 解决方案 > 当我添加实体时,无法为测试方法创建 JDBC 连接

问题描述

早上好,我的 Junit 测试有一些问题。

运行 Junit 测试时出现此错误:

java.lang.RuntimeException:无法为测试“testRecupereEvenementsATraiter”创建数据集。在 com.github.dbunit.rules.DBUnitRule$1.evaluate(DBUnitRule.java:97) 在 com.github.dbunit.rules.util.EntityManagerProvider$1.evaluate(EntityManagerProvider.java:175) 在 org.junit.rules.RunRules .evaluate(RunRules.java:20) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 在 org.junit.runners。 BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit .runners.ParentRunner.runChildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner。

原因:java.lang.RuntimeException:无法为方法 testRecupereEvenementsATraiter 创建 JDBC 连接,在测试级别或通过配置提供连接,请参阅此处 的文档: https ://github.com/rmpestano/dbunit-rules#jdbc-connection com.github.dbunit.rules.DBUnitRule$1.getConnectionFrom(DBUnitRule.java:187) 在 com.github.dbunit.rules.DBUnitRule$1.evaluate(DBUnitRule.java:92) ... 21 更多

当我在我的持久性文件中添加这些类时,就会出现这个问题:

<class>fr.gpmm.pbs.evenement.EtatEvenement</class>
<class>fr.gpmm.pbs.evenement.Evenement</class>

这是我的持久性单元:

  <persistence-unit>
    ...
  </persistence-unit>

<persistence-unit name="EvenementsDB" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>fr.gpmm.pbs.evenement.EtatEvenement</class>
    <class>fr.gpmm.pbs.evenement.Evenement</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:event;DB_CLOSE_DELAY=-1"/>
      <property name="javax.persistence.jdbc.user" value="sa"/>
      <property name="javax.persistence.jdbc.password" value=""/>
      <property name="avax.persistence.jdbc.format_sql" value="true"/>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.show_sql" value="true"/>
    </properties>
  </persistence-unit>

这是我的junit测试用例:


@RunWith(MockitoJUnitRunner.class)
public class EvenementsRepositoryTest {

    @Rule
    public EntityManagerProvider emProvider = EntityManagerProvider.instance("EvenementsDB");
    @Rule
    public DBUnitRule            dbUnitRule = DBUnitRule.instance(emProvider.connection());
    @Inject
    EvenementsRepository         repository;

    public EvenementsRepositoryTest() {
    }

    @Before
    public void setUp() {
        assertNotNull(emProvider);
        assertNotNull(dbUnitRule);
        if (repository == null) {
            EntityManager em = EntityManagerProvider.em();
            assertNotNull(em);
            EvenementsRepository fluxRepositoryImpl = new EvenementsRepositoryImpl(em);
            repository = fluxRepositoryImpl;
        }
    }

    /**
     * Test of recupereEvenementsATraiter method, of class EvenementsRepository.
     */
    @Test
    @DataSet(cleanBefore = true, value = "sampleEvenements.xml", transactional = true)
    public void testRecupereEvenementsATraiter() {
        assertNotNull(repository);
        Iterable<Evenement> result = repository.recupereEvenementsATraiter();
        assertNotNull(result);
        List<Evenement> results = IterableUtils.toList(result);
        assertNotNull(results);
        assertFalse(results.isEmpty());
        assertEquals(1, results.size());
        Evenement evenement = results.get(0);
        assertNotNull(evenement);
        assertNotNull(evenement.getId());
    }

}

这是我的实体:


@Entity
@Table(name = "xxx")
@NamedQueries(value = { //
        @NamedQuery(//
                name = "Evenement.recupereEvenementsATraiter", //
                query = "select e from Evenement e JOIN e.etats etat where etat.etat = 'A_TRAITER'"//
        )//
})
public class Evenement implements Serializable {

    public static final String        RECUPERE_EVENEMENTS_A_TRAITER = "Evenement.recupereEvenementsATraiter";

    // ID : identifiant technique auto incrémenté
    @Id
    @Column(name = "ID", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "rxevent_id_seq")
    @SequenceGenerator(name = "evenement_id_seq", sequenceName = "rxevent_id_seq", allocationSize = 1)
    private Long                      id                            = 0L;

    /**
     * version de l’entité représentant l’instance du job, initialement 0 puis incrémenté à chaque réexécution de
     * l’instance
     */
    @Version
    @Column(name = "VERSION", nullable = false)
    private Integer                   version;

    // HORODATAGE : valeur temporelle à laquelle l’évènement a été publié
    /**
     * timestamp de la première exécution de l’instance du job.
     */
    @Column(name = "HORODATAGE", nullable = true)
    private LocalDateTime             dateCreation;

    /**
     * timestamp de la dernière exécution de l’instance du job
     */
    @Column(name = "DT_DATE_MAJ", nullable = true)
    private LocalDateTime             dateModification;

    // CODE : code de l’évènement
    /**
     * nom du job.
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "CODE", nullable = false)
    private TypeEvenement             typeEvenement;

    // FK_ENTITY : clé primaire de l’entité du document créé
    /**
     * clé primaire de l’entité cible, si applicable.
     */
    @Column(name = "FK_ENTITY", nullable = true)
    private String                    entiteCible;
    /**
     * TRAITE si l’instance du job se termine sans erreur, ERREUR sinon.
     */
    // @ElementCollection(fetch = FetchType.EAGER)
    @OneToMany(mappedBy = "evenement", fetch = FetchType.EAGER)
    private Collection<EtatEvenement> etatEvenements;

    @Transient
    private Map<Connecteur, JobState> etats                         = new HashMap<>();

    public Evenement() {
    }

    public Evenement(TypeEvenement typeEvenement, String entiteCible) {
        this.dateCreation = LocalDateTime.now();
        this.dateModification = LocalDateTime.now();
        this.version = 0;
        this.typeEvenement = typeEvenement;
        this.entiteCible = entiteCible;
        for (Connecteur Connecteur : typeEvenement.getConnecteurs()) {
            this.etats.put(Connecteur, JobState.A_TRAITER);
        }
    }

    public Evenement(Evenement evenement, Connecteur connecteur, JobState etat) {
        this(evenement.typeEvenement, evenement.entiteCible);
        this.dateCreation = evenement.dateCreation;
        this.etats = evenement.etats;
        etats.put(connecteur, etat);
    }

    @PostLoad
    private void postLoad() {
        for (EtatEvenement etatEvenement : etatEvenements) {
            etats.put(etatEvenement.getConnecteur(), etatEvenement.getJobState());
        }

    }

    @PrePersist
    @PreUpdate
    private void prePersist() {
        List<Connecteur> connecteurs = Arrays.asList(typeEvenement.getConnecteurs());
        for (EtatEvenement etatEvenement : etatEvenements) {
            connecteurs.remove(etatEvenement.getConnecteur());
            etatEvenement.setJobState(getEtat(etatEvenement.getConnecteur()));
        }
        for (Connecteur connecteur : connecteurs) {
            this.etatEvenements.add(new EtatEvenement(this, connecteur, getEtat(connecteur)));
        }
    }

}

@Entity
@Table(name = "XXX")
class EtatEvenement {

    @Id
    @ManyToOne
    @Column(name = "evenement", nullable = false)
    private Evenement  evenement;

    @Enumerated(EnumType.STRING)
    @Id
    @Column(name = "connecteur", nullable = false)
    private Connecteur connecteur;

    @Enumerated(EnumType.STRING)
    @Column(name = "etat", nullable = false)
    private JobState   etat;

    EtatEvenement(final Evenement evenement, final Connecteur Connecteur, final JobState etat) {
        this.evenement = evenement;
        this.connecteur = connecteur;
        this.etat = etat;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof EtatEvenement) {
            EtatEvenement etatEvenement = (EtatEvenement) obj;
            return this.evenement.getId() == etatEvenement.evenement.getId() && //
                    this.connecteur == etatEvenement.connecteur && //
                    this.etat == etatEvenement.etat;
        } else {
            return false;
        }
    }

}

请帮忙 !

标签: hibernatejunit4persistence.xml

解决方案


推荐阅读