2011-03-30 4 views
1

Existe-t-il un moyen de modifier les propriétés d'un fichier? J'essaie d'exécuter des tests de sélénium en parallèle, avec Spring et Jetty, donc j'essaye de configurer l'url de la base de données, le port du jettyserver et le port du serveur sélénium. Alors que je suis en mesure d'initialiser deux serveurs ou plus où les tests peuvent s'exécuter.Définition des propriétés au printemps

Mon fichier contient server.properties ceci:

jdbc.url=jdbc:hsqldb:hsql://localhost/bibliothouris_scenario 
jetty.port=8081 
seleniumServer.port=4444 

Je peux lire ces propriétés avec un PropertyPlaceholderConfigurer, et je besoin de l'URL de base de données, Jettyport et port seleniumserver être flexible.

Je les ai déclarées comme ceci:

Dans mon applicationContext.xml:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>classpath:server.properties</value> 
    </property> 
</bean> 

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="" /> 
</bean> 

Dans le fichier serverContext.xml:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>classpath:server.properties</value> 
    </property> 
</bean> 

<bean class="com.~companyName~.bibliothouris.jetty.JettyServer" init-method="start" destroy-method="stop"> 
    <constructor-arg value="${jetty.port}" /> 
    <constructor-arg ref="dataSource" /> 
</bean> 

<bean class="org.openqa.selenium.server.SeleniumServer" init-method="start" destroy-method="stop"> 
    <constructor-arg> 
     <bean class="org.openqa.selenium.server.RemoteControlConfiguration"> 
      <property name="port" value="${seleniumServer.port}" /> 
      <property name="singleWindow" value="true" /> 
      <property name="timeoutInSeconds" value="10" /> 
     </bean> 
    </constructor-arg> 
</bean> 

<bean class="com.thoughtworks.selenium.DefaultSelenium" init-method="start" destroy-method="stop" lazy-init="true"> 
    <constructor-arg> 
     <bean class="com.thoughtworks.selenium.HttpCommandProcessor"> 
      <constructor-arg value="localhost" /> 
      <constructor-arg value="${seleniumServer.port}" /> 
      <constructor-arg value="*firefox c:/~companyname~/firefox/firefox.exe" /> 
      <constructor-arg value="http://localhost:${jetty.port}" /> 
     </bean> 
    </constructor-arg> 
</bean> 

Quand je change les données dans le serveur. propriétés les tests de sélénium fonctionnent sur les bons serveurs avec les bons ports, sans échecs. Je cherche maintenant une méthode pour changer les propriétés dans le fichier server.properties.

salutations et merci à l'avance

Répondre

1

Merci pour l'aide les gars, sans votre information, je ne pouvais pas trouver ma propre solution. Ici, il est:

try { 
     Properties props = new Properties(); 
     FileInputStream fileInputStream = new FileInputStream(
      "C:\\~CompanyName~\\workspace\\bibliothouris\\infrastructure\\src\\main\\resources\\server.properties"); 
     props.load(fileInputStream); 
     fileInputStream.close(); 
     props.setProperty("seleniumServer.port", "4445"); 

     FileOutputStream fileOutputStream = new FileOutputStream(
      "C:\\~CompanyName~\\workspace\\bibliothouris\\infrastructure\\src\\main\\resources\\server.properties"); 
     props.store(fileOutputStream, ""); 
     fileOutputStream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

J'ai écrit ce morceau de code dans un testclass, maintenant je dois créer une méthode de celui-ci, qui prend quelques arguments (l'URL, Jettyport et seleniumport). Et je dois changer le chemin à un parent.

Merci pour l'aide!

+0

@Walle, s'il vous plaît upvote les réponses qui ont aidé, nous sommes également ici pour la réputation;) –

+0

J'ai besoin de 15 réputation pour faire cela: D – Walle

+1

Mat est bon, vous devez accéder aux ressources classpath via getResourceAsStream, sinon votre code se casse lorsqu'il est exécuté dans un environnement différent –

1

Je résolus en ayant un drapeau dans mon processus de construction (j'utilise Maven) qui a choisi la propriété quel fichier à inclure dans la dernière guerre. De cette façon, vous pouvez inclure différents artefacts (différents fichiers de propriétés) avec des propriétés différentes sans avoir à jouer avec le support des propriétés de bas niveau de Spring. Si vous avez besoin de faire cela est Spring seulement, je recommanderais d'aller pour une configuration basée sur Java, où vous pouvez obtenir et définir les propriétés par le code pas en XML.

+0

J'utilise aussi Maven, mais c'est la première fois que je l'utilise. Je vais l'essayer;) – Walle

1

Existe-t-il un moyen de modifier les propriétés d'un fichier?

Non, mais vous pouvez résoudre ce problème de la façon suivante.

  • diviser les propriétés en jdbc.properties (pour applicationContext.xml) et test.properties (pour serverContext.xml)
  • de server.properties override via un src/test/ressources ressources
  • propriétés du système d'utilisation en plus de server.properties (utilisez PropertyPlaceholderConfigurer.setSystemPropertiesMode pour cela)
Questions connexes