J'ai trouvé un exemple de la façon d'utiliser DBUnit here, from the junitbook2 exampleorg.dbunit.dataset.NoSuchTableException: UserTest
Je l'ai essayé et il fonctionne, je dois donc essayer de l'utiliser dans mon projet; mon projet est basé sur maven, et pour utiliser la base de données, j'utilise une référence à un pot externe qui crée le bean de ma table avec "ant run". Donc dans mon projet maven j'ai créé 1 Interface (UserDao) dans mon src/main/java + autre classe dans src/test/java comme l'exemple du livre.
interface UserDao:
import java.sql.SQLException;
import com.mydb.UserTest;
public interface UserDao {
/**
* Insert an user in the database.
*
* @param user user to be inserted
* @return if id the inserted user
*/
long addUser(UserTest user) throws SQLException;
UserTest getUserById(long id) throws SQLException;
}
AbstractDbUnitTestCase:
import static org.junit.Assert.*;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.ext.hsqldb.HsqldbConnection;
import org.junit.AfterClass;
import org.junit.BeforeClass;
public abstract class AbstractDbUnitTestCase {
protected static UserDaoJdbcImpl dao = new UserDaoJdbcImpl();
protected static Connection connection;
protected static HsqldbConnection dbunitConnection;
@BeforeClass
public static void setupDatabase() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://mydb/mydb","user","password");
if (connection != null)
System.out.println("Connected to the database");
dbunitConnection = new HsqldbConnection(connection,null);
dao.setConnection(connection);
}
@AfterClass
public static void closeDatabase() throws Exception {
if (dbunitConnection != null) {
dbunitConnection.close();
dbunitConnection = null;
}
}
public static IDataSet getDataSet(String name) throws Exception {
InputStream inputStream = AbstractDbUnitTestCase.class.getResourceAsStream(name);
assertNotNull("file " + name + " not found in classpath", inputStream);
Reader reader = new InputStreamReader(inputStream);
FlatXmlDataSet dataset = new FlatXmlDataSet(reader);
return dataset;
}
public static IDataSet getReplacedDataSet(String name, long id) throws Exception {
IDataSet originalDataSet = getDataSet(name);
return getReplacedDataSet(originalDataSet, id);
}
public static IDataSet getReplacedDataSet(IDataSet originalDataSet, long id) throws Exception {
ReplacementDataSet replacementDataSet = new ReplacementDataSet(originalDataSet);
replacementDataSet.addReplacementObject("[ID]", id);
replacementDataSet.addReplacementObject("[NULL]", null);
return replacementDataSet;
}
}
UserDaoJdbcImplTest -> où est le test
import static org.junit.Assert.*;
import static com.test.EntitiesHelper.*;
import org.dbunit.Assertion;
import org.dbunit.dataset.IDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Ignore;
import org.junit.Test;
import com.mydb.UserTest;
public class UserDaoJdbcImplTest extends AbstractDbUnitTestCase {
@Test
public void testGetUserById() throws Exception {
IDataSet setupDataSet = getDataSet("/user.xml");
DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, setupDataSet);
UserProvaTest user = dao.getUserById(1);
assertNotNull(user);
assertEquals("Jeffrey", user.getFirstName());
assertEquals("Lebowsky", user.getLastName());
assertEquals("ElDuderino", user.getUsername());
}
@Test @Ignore("fails if run together with others")
public void testAddUser() throws Exception {
UserProvaTest user = newUser();
long id = dao.addUser(user);
assertTrue(id>0);
IDataSet expectedDataSet = getDataSet("/user.xml");
IDataSet actualDataSet = dbunitConnection.createDataSet();
Assertion.assertEquals(expectedDataSet, actualDataSet);
}
@Test
public void testAddUseIgnoringId() throws Exception {
IDataSet setupDataSet = getDataSet("/user.xml");
DatabaseOperation.DELETE_ALL.execute(dbunitConnection, setupDataSet);
UserProvaTest user = newUser();
long id = dao.addUser(user);
assertTrue(id>0);
IDataSet expectedDataSet = getDataSet("/user.xml");
IDataSet actualDataSet = dbunitConnection.createDataSet();
Assertion.assertEqualsIgnoreCols(expectedDataSet, actualDataSet, "users", new String[] { "id" });
}
@Test
public void testGetUserByIdReplacingIds() throws Exception {
long id = 42;
IDataSet setupDataset = getReplacedDataSet("/user-token.xml", id);
DatabaseOperation.INSERT.execute(dbunitConnection, setupDataset);
UserProvaTest user = dao.getUserById(id);
assertUser(user);
}
@Test
public void testAddUserReplacingIds() throws Exception {
IDataSet setupDataSet = getDataSet("/user-token.xml");
DatabaseOperation.DELETE_ALL.execute(dbunitConnection, setupDataSet);
UserProvaTest user = newUser();
long id = dao.addUser(user);
assertTrue(id>0);
IDataSet expectedDataSet = getReplacedDataSet(setupDataSet, id);
IDataSet actualDataSet = dbunitConnection.createDataSet();
Assertion.assertEquals(expectedDataSet, actualDataSet);
}
}
Mon Bean UserTest est créé de cette façon:
@Entity (name="mydb_UserTest")@Table(name="UserTest"
,catalog="mydb")
et le fichier user.xml:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<mydb_UserTest id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" />
</dataset>
Mais quand j'ai essayé d'exécuter le test je cette erreur:
testGetUserById(com.test.UserDaoJdbcImplTest) Time elapsed: 0.176 sec <<< ERROR! org.dbunit.dataset.NoSuchTableException: UserTest
je voir que:
- la mais la connexion à la base de données est correcte
- mais peu importe ce que j'ai écrit dans le fichier user.xml, f ou l'exemple User1111Test au lieu de UserTest, l'erreur est la même (comme org.dbunit.dataset.NoSuchTableException: User1111Test); J'ai également essayé d'utiliser schema.UserTest, cela est suggéré here mais l'erreur est la même NoSuchTableException: schema.UserTest.
- L'erreur est dans ce point:
DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, setupDataSet);
que je fais quelque chose de mal?
Merci pour la réponse, la méthode setUpDatabaseConfig n'est pas présente dans mon projet, voulez-vous dire setupDatabase dans mon AbstractDbUnitTestCase? Peux-tu être plus précis? Et mon nom de table est UserTest, il n'y a pas de problème avec les majuscules? merci –
J'ai édité la réponse. Mes noms de table sont en minuscules et j'ai également émis un jeu de données en minuscules. –
J'ai changé mon code avec le vôtre, j'ai mis le code que vous suggérez à la fin de ma méthode setupDatabase() et maintenant il y a cette erreur avant l'erreur habituelle: 10 [principal] INFO org.dbunit.database.DatabaseConfig - Inconnu propriété 'http://www.dbunit.org/features/qualifiedTableNames'. Impossible de valider le type de l'objet à définir. Veuillez informer un développeur de mettre à jour la liste des propriétés. org.dbunit.dataset.NoSuchTableException: SCHEMA.USERTEST –