Hallo.
Beim Versuch eine Entity-Klasse mittels JUnit zu überprüfen habe ich ein Problem.
Das Problem liegt in der Methode AfterClass. Hier soll nach dem Ende aller Tests der Ordner mit der Datenbank wieder gelöscht werden. Hierzu verwende ich die Methode FileUtils.deleteDirectory(String) aus Apache IO. Diese vereinfacht das Löschen von nicht leeren Verzeichnis gegenüber den Standard Java-Methoden. Wird der Test nun ausgeführt wird die Methode deleteDirectory eine Exception. Dies ist eigentlich nur der Fall wenn eine Datei/Verzeichnis nicht gelöscht werden kann weil zum Beispiel die Datei nicht richtig geschlossen wurde. (Obwohl der EntityManager und die Factory geschlossen wurden.)
Wie kann ich bei EclipseLink, oder JPA, sicherstellen, dass die Datenbank, bzw. die zugehörigen Files, ordnungsgemäß geschlossen wurden.
Hier die Persistence.xml
[XML]
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="todos" transaction-type="RESOURCE_LOCAL">
<class>rh.jpa.entities.ToDo</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:derby:databases/simpleDb;create=true" />
<property name="javax.persistence.jdbc.user" value="test" />
<property name="javax.persistence.jdbc.password" value="test" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
</properties>
</persistence-unit>
</persistence>
[/XML]
Hier die Entityklasse:
Hier die Testklasse:
Beim Versuch eine Entity-Klasse mittels JUnit zu überprüfen habe ich ein Problem.
Das Problem liegt in der Methode AfterClass. Hier soll nach dem Ende aller Tests der Ordner mit der Datenbank wieder gelöscht werden. Hierzu verwende ich die Methode FileUtils.deleteDirectory(String) aus Apache IO. Diese vereinfacht das Löschen von nicht leeren Verzeichnis gegenüber den Standard Java-Methoden. Wird der Test nun ausgeführt wird die Methode deleteDirectory eine Exception. Dies ist eigentlich nur der Fall wenn eine Datei/Verzeichnis nicht gelöscht werden kann weil zum Beispiel die Datei nicht richtig geschlossen wurde. (Obwohl der EntityManager und die Factory geschlossen wurden.)
Wie kann ich bei EclipseLink, oder JPA, sicherstellen, dass die Datenbank, bzw. die zugehörigen Files, ordnungsgemäß geschlossen wurden.
Hier die Persistence.xml
[XML]
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="todos" transaction-type="RESOURCE_LOCAL">
<class>rh.jpa.entities.ToDo</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:derby:databases/simpleDb;create=true" />
<property name="javax.persistence.jdbc.user" value="test" />
<property name="javax.persistence.jdbc.password" value="test" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
</properties>
</persistence-unit>
</persistence>
[/XML]
Hier die Entityklasse:
Java:
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public final class ToDo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic
private String summary;
@Basic
private String description;
public ToDo() {
super();
}
public String getSummary() {
ToDo.LOGGER.debug(this.summary);
return this.summary;
}
public void setSummary(final String summary) {
ToDo.LOGGER.debug(summary);
this.summary = summary;
}
public String getDescription() {
return this.description;
}
public void setDescription(final String description) {
this.description = description;
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append(this.getClass().getSimpleName());
builder.append(" [id=");
builder.append(this.id);
builder.append(", summary=");
builder.append(this.summary);
builder.append(", description=");
builder.append(this.description);
builder.append("]");
return builder.toString();
}
}
Hier die Testklasse:
Java:
import java.io.File;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import org.apache.commons.io.FileUtils;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public final class JPA_3_1_7 {
private static final String PERSISTENCE_UNIT_NAME = "todos";
private static EntityManagerFactory factory;
private static EntityManager em;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
JPA_3_1_7.factory = Persistence.createEntityManagerFactory(JPA_3_1_7.PERSISTENCE_UNIT_NAME);
JPA_3_1_7.em = JPA_3_1_7.factory.createEntityManager();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
JPA_3_1_7.em.close();
JPA_3_1_7.factory.close();
final File directory = new File(System.getProperty("user.dir")
+ System.getProperty("file.separator")
+ "databases");
FileUtils.deleteDirectory(directory);
}
@SuppressWarnings("static-method")
@Test
public void initialize() {
Assert.assertNotNull("EntityManagerFactory not initialized", JPA_3_1_7.factory);
}
@SuppressWarnings("static-method")
@Test
public void read() {
// read the existing entries and write to the logger
final TypedQuery<ToDo> q = JPA_3_1_7.em.createQuery("select t from ToDo t", ToDo.class);
final List<ToDo> todoList = q.getResultList();
for (final ToDo todo : todoList) {
System.out.println(todo);
}
}
@SuppressWarnings("static-method")
@Test
public void write() {
// create new todo
JPA_3_1_7.em.getTransaction().begin();
final ToDo todo = new ToDo();
todo.setSummary("test: summary"); //$NON-NLS-1$
todo.setDescription("test: description"); //$NON-NLS-1$
JPA_3_1_7.em.persist(todo);
JPA_3_1_7.em.getTransaction().commit();
}
}