hibernate - 当我添加实体时,无法为测试方法创建 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;
}
}
}
请帮忙 !
解决方案
推荐阅读
- kubernetes - 根据网络请求运行 Kubernetes 作业(也称为基于套接字的激活)
- android - React Native 添加 Picker 数组
- java - 提高/降低性能的 Cicles 方面
- python - PyQt5标签被切断
- informatica - 我想存储第一条记录的列值并将该值与其余记录进行比较
- c# - .net 核心找不到“JavaScriptSerializer”
- javascript - 在 Web 服务器上显示 txt 文件的内容
- javascript - 创建鼠标选择框
- java - 调试和运行 JavaFx Eclipse 项目时找不到 Java 类
- php - Swiftmailer 电子邮件大小