2017-04-11 3 views
0

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:

  1. la mais la connexion à la base de données est correcte
  2. 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.
  3. L'erreur est dans ce point:

    DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, setupDataSet);

que je fais quelque chose de mal?

Répondre

0

Enfin, j'ai obtenu la solution .... je change mon nom de la table, sur mon db, de « UserTest » à « usertest », et j'utilise cette user.xml

<?xml version='1.0' encoding='UTF-8'?> 
<dataset> 
    <USEREST id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" /> 
</dataset> 

Je pense que, dans mon cas, il n'y a pas d'autre solution parce que les 2 propriétés:

config.setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true); 
config.setProperty(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, true); 

Retour cette information, ils ne fonctionnent pas:

9 [main] INFO org.dbunit.database.DatabaseConfig - Unknown property 'http://www.dbunit.org/features/qualifiedTableNames'. Cannot validate the type of the object to be set. Please notify a developer to update the list of properties. 
9 [main] INFO org.dbunit.database.DatabaseConfig - Unknown property 'http://www.dbunit.org/features/caseSensitiveTableNames'. Cannot validate the type of the object to be set. Please notify a developer to update the list of properties. 

MISE à JOUR: la solution pour éviter l'info/erreur de FEATURE_QUALIFIED_TABLE_NAMES est d'utiliser

dbunitConnection.getConfig().setFeature(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true); 
dbunitConnection.getConfig().setFeature(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, true); 

au lieu de setProperty, et changer HsqldbConnection dbunitConnection à MySqlConnection dbunitConnection.

0

Vous devez ajouter FEATURE_QUALIFIED_TABLE_NAMES propriété:

DatabaseConfig config = dBConn.getConfig(); 
config.setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true); 

Placez-le dans votre méthode de setupDatabase.

Dans votre dataset vous devez ajouter le nom du schéma:

<?xml version='1.0' encoding='UTF-8'?> 
<dataset> 
<SCHEMA.USERTEST ID="1" USERNAME="ELDUDERINO" FIRST_NAME="JEFFREY" LAST_NAME="LEBOWSKY" /> 
</dataset> 

Notez le jeu de données en majuscules.

Espérons que cela aide.

+0

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 –

+0

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. –

+0

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 –

0

Sur la base de cette information:

@Entity (name="mydb_UserTest")@Table(name="UserTest" 
    ,catalog="mydb") 

le nom de la table de fichier DbUnit correct est:

<?xml version='1.0' encoding='UTF-8'?> 
<dataset> 
    <mydb.UserTest id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" /> 
</dataset> 

ou sans le nom de schéma si c'est le schéma par défaut pour l'utilisateur de base de données (généralement lorsque le schéma nom correspond au nom d'utilisateur):

<?xml version='1.0' encoding='UTF-8'?> 
<dataset> 
    <UserTest id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" /> 
</dataset> 
+0

J'ai déjà essayé la version 2 mais elles ne fonctionnent pas ... –