takimafr / spring-dbunit

DBUnit support for Spring
Apache License 2.0
40 stars 19 forks source link

Can you please add a way to specify Connection schema #18

Closed jflefebvre06 closed 11 years ago

slandelle commented 11 years ago

Any idea on how I'd do that? Depending on the database, one can specify the default schema in the connection url, but there's no generic mechanism I'm aware of.

jflefebvre06 commented 11 years ago

I think you can base it on a system property to define If property GetConnection(con, property) Else Getconnection

What do you think about That ?

Le 30 oct. 2012 à 22:14, "Stephane Landelle" notifications@github.com<mailto:notifications@github.com> a écrit :

Any idea on how I'd do that? Depending on the database, one can specify the default schema in the connection url, but there's no generic mechanism I'm aware of.

— Reply to this email directly or view it on GitHubhttps://github.com/excilys/spring-dbunit/issues/18#issuecomment-9923148.

slandelle commented 11 years ago

OK, I hadn't realized that DBUnit's DatabaseConnection had such a functionality. I will implement this in the next days, stay tuned.

jflefebvre06 commented 11 years ago

Thanks a lot

slandelle commented 11 years ago

@jflefebvre06 I've pushed the feature in the master. Could you try it out and tell me if it suits your needs, please?

jflefebvre06 commented 11 years ago

Bonjour Stephane Merci pour cette implémentation super rapide !!!! Cela fonctionne très bien mais j aurais fait une autre approche plutôt basée sur une propriété system car d'un environnement à l'autre (dev, qualif,...) le nom du schéma est très souvent différent et avec l'implementation proposée il est impossible de la paramétrer Autre idée, définition d'un bean de config, non obligatoire injecté en autowire (required=false) contenant la propriété schéma JF

bokc commented 11 years ago

Bonjour, Je suis d'accord avec JF. J'utilise dans mon cas 2 types de bases de données differentes suivant si je fais des tests en dev (base mémoire) ou des tests pour la qualification (DB2 sur AS400) or le nom du schemas est differents.

BokC

slandelle commented 11 years ago

Bonjour,

Je comprend bien le besoin.

L'approche d'un bean spring de configuration existe déjà pour le module web, mais pas pour le module test. De manière générale, j'aimerais refactorer la partie configuration afin de permettre des stratégies de fallback, un peu comme le fait la librairie config de TypeSafe. Je ne pourrais faire ça que dans une prochaine version, ce qui n'arrivera pas avant quelques temps (malheureusement, j'ai peu de dispos en ce moment et je les consacre en priorité à mon autre projet Gatling), pas avant décembre.

Dans l'immédiat, je vais mettre en place une propriété System, mais il s'agira d'un hack voué à disparaitre (si l'on dispose d'un bean Spring, il est configurable via un PPHC qui peut résoudre des propriétés System).

Je fais rapidement et sors une release.

Stéphane

Le 6 novembre 2012 14:49, bokc notifications@github.com a écrit :

Bonjour, Je suis d'accord avec JF. J'utilise dans mon cas 2 type de bases de données differentes suiavnt si je fais des tests en dev (base mémoire) ou des tests (DB2 sur AS400) pour la qualification or le nom du schemas est differents.

BokC

— Reply to this email directly or view it on GitHubhttps://github.com/excilys/spring-dbunit/issues/18#issuecomment-10111034.

slandelle commented 11 years ago

Je viens de pusher les modifications. La propriété s'appelle "spring.dbunit.schema". Pourriez-vous me faire un retour afin que je fasse la release, svp?

Stéphane

Le 6 novembre 2012 14:59, Stéphane Landelle slandelle@excilys.com a écrit :

Bonjour,

Je comprend bien le besoin.

L'approche d'un bean spring de configuration existe déjà pour le module web, mais pas pour le module test. De manière générale, j'aimerais refactorer la partie configuration afin de permettre des stratégies de fallback, un peu comme le fait la librairie config de TypeSafe. Je ne pourrais faire ça que dans une prochaine version, ce qui n'arrivera pas avant quelques temps (malheureusement, j'ai peu de dispos en ce moment et je les consacre en priorité à mon autre projet Gatling), pas avant décembre.

Dans l'immédiat, je vais mettre en place une propriété System, mais il s'agira d'un hack voué à disparaitre (si l'on dispose d'un bean Spring, il est configurable via un PPHC qui peut résoudre des propriétés System).

Je fais rapidement et sors une release.

Stéphane

Le 6 novembre 2012 14:49, bokc notifications@github.com a écrit :

Bonjour,

Je suis d'accord avec JF. J'utilise dans mon cas 2 type de bases de données differentes suiavnt si je fais des tests en dev (base mémoire) ou des tests (DB2 sur AS400) pour la qualification or le nom du schemas est differents.

BokC

— Reply to this email directly or view it on GitHubhttps://github.com/excilys/spring-dbunit/issues/18#issuecomment-10111034.

jflefebvre06 commented 11 years ago

Bonjour de Stéphane,

Je viens de checker, ca marche impec.

Merci beaucoup

slandelle commented 11 years ago

Release done: 1.1.10

bokc commented 11 years ago

Je n'arrive pas a l'utiliser.

Dans ma config Spring j'ai rajouté ca pour positionner la variable "System" : <bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" value="#{@systemProperties}" /> <property name="targetMethod" value="putAll" /> <property name="arguments"> <!-- The new Properties --> <util:properties> <prop key="spring.dbunit.schema">${database.schema}</prop> </util:properties> </property> </bean>

En mode debug j'ai bien le System.getProperty("spring.dbunit.schema") qui me donne le nom du schema que j'ai définit. Par contre dans DbUnitDatabasePopulator ligne 57 (String schema = dataSetConfiguration.getSchema();) le schema est null.

Aurais-je oublié quelque chose?

L'entête de mon TestU : @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/app-config.xml", "/junit-config.xml", "/security-config-test.xml" }) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DataSetTestExecutionListener.class }) @DataSet(locations = { "/bouchons/BaseTablesReference.xml", "/bouchons/authentification/Utilisateur.xml", "/bouchons/Devise.xml", "/bouchons/localisation/Filiale.xml" }, tearDownOperation= DBOperation.DELETE_ALL, columnSensing = true) public class UtilisateurServiceTest extends ServiceBaseTest<IUtilisateurService, Utilisateur> {

slandelle commented 11 years ago

Il faudra que je regarde dans le code (pas accès pour l'instant), mais pourquoi faire aussi complexe?

Par exemple, si les tests sont lancés depuis maven, il suffit de configurer la propriété System au niveau de surefire (éventuellement avec un profile selon l'environnement): http://maven.apache.org/plugins/maven-surefire-plugin/examples/system-properties.html

2012/11/7 bokc notifications@github.com

Je n'arrive pas a l'utiliser.

Dans ma config Spring j'ai rajouté ca pour positionner la variable "System" : <bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">

util:properties ${database.schema} /util:properties

En mode debug j'ai bien le System.getProperty("spring.dbunit.schema") qui me donne le nom du schema que j'ai définit. Par contre dans DbUnitDatabasePopulator ligne 57 (String schema = dataSetConfiguration.getSchema();) le schema est null.

Aurais-je oublié quelque chose?

L'entête de mon TestU : @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/app-config.xml", "/junit-config.xml", "/security-config-test.xml" }) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DataSetTestExecutionListener.class }) @DataSet(locations = { "/bouchons/BaseTablesReference.xml", "/bouchons/authentification/Utilisateur.xml", "/bouchons/Devise.xml", "/bouchons/localisation/Filiale.xml" }, tearDownOperation= DBOperation.DELETE_ALL, columnSensing = true) public class UtilisateurServiceTest extends ServiceBaseTest {

— Reply to this email directly or view it on GitHubhttps://github.com/excilys/spring-dbunit/issues/18#issuecomment-10151294.

jflefebvre06 commented 11 years ago

Pour info, j’avais testé en settant la propriété system via surefire.

slandelle commented 11 years ago

@jflefebvre06 De quelle manière as-tu testé? J'ai l'impression que j'ai fait une boulette et que la propriété System est systématiquement écrasée par la propriété de @DataSet -> null @bokc Pourrais-tu builder le code source en apportant la modification suivante? dans com.excilys.ebi.spring.dbunit.config.DataSetConfiguration vers la ligne 165:

if (!schema.isEmpty()) dataSetConfiguration.schema = schema;

Le 7 novembre 2012 16:41, Stéphane Landelle slandelle@excilys.com a écrit :

Il faudra que je regarde dans le code (pas accès pour l'instant), mais pourquoi faire aussi complexe?

Par exemple, si les tests sont lancés depuis maven, il suffit de configurer la propriété System au niveau de surefire (éventuellement avec un profile selon l'environnement):

http://maven.apache.org/plugins/maven-surefire-plugin/examples/system-properties.html

2012/11/7 bokc notifications@github.com

Je n'arrive pas a l'utiliser.

Dans ma config Spring j'ai rajouté ca pour positionner la variable "System" : <bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">

util:properties ${database.schema} /util:properties

En mode debug j'ai bien le System.getProperty("spring.dbunit.schema") qui me donne le nom du schema que j'ai définit. Par contre dans DbUnitDatabasePopulator ligne 57 (String schema = dataSetConfiguration.getSchema();) le schema est null.

Aurais-je oublié quelque chose?

L'entête de mon TestU : @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/app-config.xml", "/junit-config.xml", "/security-config-test.xml" }) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DataSetTestExecutionListener.class }) @DataSet(locations = { "/bouchons/BaseTablesReference.xml", "/bouchons/authentification/Utilisateur.xml", "/bouchons/Devise.xml", "/bouchons/localisation/Filiale.xml" }, tearDownOperation= DBOperation.DELETE_ALL, columnSensing = true) public class UtilisateurServiceTest extends ServiceBaseTest {

— Reply to this email directly or view it on GitHubhttps://github.com/excilys/spring-dbunit/issues/18#issuecomment-10151294.

bokc commented 11 years ago

Le code que tu proposes corrige le pb.

slandelle commented 11 years ago

Bon, ben, je vais corriger et faire une nouvelle release...

2012/11/7 bokc notifications@github.com

Le code que tu proposes corrige le pb.

— Reply to this email directly or view it on GitHubhttps://github.com/excilys/spring-dbunit/issues/18#issuecomment-10156749.

slandelle commented 11 years ago

Changed milestone to 1.1.11

slandelle commented 11 years ago

Release done

gaffney commented 10 years ago

Chose this over Spring-Test-DBUnit because of this feature. (Couldn't find an elegant way of overcoming the DBUnit "AmbiguousTableNameException" if you have multiple schemas that reference the same table.)

Thanks.