2011-03-07 4 views
3

J'essaie de tester mon code plugin portlet liferay en utilisant JUNIT et Mockito. Actuellement, je me moque des implémentations de service pour renvoyer des données fictives et tester les fonctionnalités.Liferay Junit-Mockito test

Le problème que je suis confronté est, je dois tester un code qui a des propriétés comme: PropsUtil.get (« someKey ») Mais quand je le lance comme un test JUnit autonome, PropsUtil ne lit pas de l'un des le fichier de propriétés. Est-il possible de faire lire le test à partir du fichier de propriétés liferay (portal * .properties) sans modifier le code source?

Répondre

3

J'utilisé la méthode suivante:

  • Mon TestClass étend BaseServiceTestCase (disponible en Liferay src)
  • Conserver portal-test.properties dans le dossier de test (avec les valeurs de test).
  • Exécutez le scénario de test.

Dans ce cas, liferay charge toutes les propriétés ainsi que les initialisations du ressort.

0

À moins que vous testez que les valeurs sont effectivement définies dans portal.properties, il suffit d'appeler PropsUtil.set dans votre test.

+0

Salut J'utilise PropsUtil de portal-kernel.jar (un d pas de portal-impl.jar), il n'y a donc pas de méthode setter pour définir la valeur manuellement. – simplysiby

0

vous devez appeler InitUtil.init() qui initialise les infrastructures de base, y compris les propriétés ...

Si vous voulez aller plus loin et démarrer même l'infrastructure de printemps, vous aurez besoin d'avoir des bibliothèques Liferay sur classpath. J'explique comment faire cela dans un environnement maven dans cet article: how to use liferay third-party libraries in maven plugin SDK. Si vous le faites, tout ce que vous devez faire est de configurer spring.configs avec les définitions de spring xml de portail (ceux d'infrastructure + ceux avec des services printaniers que vous devez utiliser) et appelez Init.initWithSpring(); qui s'occupe du démarrage du portail liferay et il utilise ces haricots de printemps que vous mélangez dans spring.configs. Vous devrez également modifier un peu les propriétés de liferay. Mais cela dépend vraiment du cas d'utilisation.

2

En dernier recours, vous pouvez utiliser PowerMock et simulé appel de méthode PropsUtil.get(). Finalement, il est une plaine vieux-java-singleton et le code avec singletons est pas facile à tester ..

+1

Powermock améliore les APIs EasyMock et Mockito pour permettre de se moquer des méthodes statiques, du code non public comme les constructeurs/variables/méthodes privés, des classes finales et des méthodes. Vous voudrez peut-être aller plus facilement, car dans certains cas, vous devriez probablement refactoriser votre code au lieu de vous moquer et de vous moquer d'une douzaine d'appels à l'intérieur d'une méthode. Bien sûr, cela vous permet de ne pas polluer votre API en ajoutant des méthodes qui existent uniquement pour permettre le test unitaire. – trafalmadorian

0

Vous pouvez également se moquer de l'appel comme celui-ci:

mockStatic(PropsUtil.class); 

when(
    PropsUtil.get(PropsKeys.SOCIAL_ACTIVITY_COUNTER_PERIOD_LENGTH) 
).thenReturn("1"); 
+0

Merci pour le code Julio.Mais je ne pense pas que mockStatic() fait partie du code Mockito. – simplysiby

1

Vous pouvez créer une Properties implémentation basée sur de l'interface Props:

private static class MockProps implements Props { 
    private Properties properties = new Properties(); 

    MockProps addProperty(String key, String value) { 
     properties.setProperty(key, value); 
     return this; 
    } 

    @Override 
    public boolean contains(String key) { 
     return properties.containsKey(key); 
    } 

    @Override 
    public String get(String key) { 
     return properties.getProperty(key); 
    } 

    @Override 
    public String get(String key, Filter filter) { 
     throw new UnsupportedOperationException("not needed by mock"); 
    } 

    @Override 
    public String[] getArray(String key) { 
     throw new UnsupportedOperationException("not needed by mock"); 
    } 

    @Override 
    public String[] getArray(String key, Filter filter) { 
     throw new UnsupportedOperationException("not needed by mock"); 
    } 

    @Override 
    public Properties getProperties() { 
     return properties; 
    } 

    @Override 
    public Properties getProperties(String prefix, boolean removePrefix) { 
     return PropertiesUtil.getProperties(properties, prefix, removePrefix); 
    } 
} 

Ensuite, utilisez un @BeforeClass pour le configurer:

@BeforeClass 
public static void init() { 
    PropsUtil.setProps(new MockProps() 
      .addProperty("key1", "silly") 
      .addProperty("key2", "silly again")); 
}