2017-05-30 2 views
0

En utilisant une combinaison de testng et jmockit pour effectuer des tests unitaires. Dans une méthode que je teste, il tente d'accéder à une propriété système que j'ai définie à l'aide d'un script de déploiement JBoss. Mon test d'unité n'a donc pas accès à l'ensemble de l'environnement JBoss pour accéder aux propriétés. . J'ai essayé de me moquer et de définir la variable système directement dans mon test, mais la propriété system retourne toujours null dans la classe que je suis en train de tester.Définir la propriété système dans le test d'unité jmockit

La classe testée:

//returns the correct value in the application but returns null for the test 
public static final String webdavrootDir = System.getProperty("property.name"); 

public String getFileUrl(){ 
     StringBuilder sb = new StringBuilder(); 
     return sb.append(webdavrootDir) 
       .append(intervalDir) 
       .append(fileName) 
       .toString(); 
} 

Le test:

@Test 
    public void getUrl(@Mocked System system){ 
     system.setProperty("property.name", "https://justatest.com/dav/bulk"); 
     String fileUrl = csvConfig.getFileUrl(); 

     assertEquals(fileUrl, "https://justatest.com/dav/bulk/otherstuff"); 
} 

Le test détecte la valeur null/otherstuff mais attend https://justatest.com/dav/bulk/otherstuff

J'ai également essayé de placer la propriété du système dans un testng @BeforeMethod méthode sans succès.

Répondre

3

Assurez-vous d'appeler System.setProperty("property.name", "https://justatest.com/dav/bulk"); avant que la classe testée soit instanciée, sinon le champ statique sera toujours nul.

Envisagez d'utiliser une méthode de configuration @BeforeClass pour cela:

@BeforeClass 
public void setup() { 
    System.setProperty("property.name", "https://justatest.com/dav/bulk"); 
    // Instantiate your CsvConfig instance here if applicable. 
} 

puis

@Test 
public void getUrl(){ 
    System.setProperty("property.name", "https://justatest.com/dav/bulk"); 
    String fileUrl = csvConfig.getFileUrl(); 
    assertEquals(fileUrl, "https://justatest.com/dav/bulk/otherstuff"); 
} 
1

Si vous voulez utiliser jMocki, mais vous devez vous assurer qu'il est fait, avant classe- le sous-test est en cours de chargement (à cause du champ statique).

@BeforeClass 
public static void fakeSystemProperty() { 
    new MockUp<System>() { 

     @Mock 
     public String getProperty(String key) { 
      return "https://justatest.com/dav/bulk"; 
     } 
    }; 
} 

Une autre façon serait de modifier la classe sous test et se moquer partiellement celui-ci, par exemple .:

public class CsvConfig { 
    private static final String webdavrootDir = System.getProperty("property.name"); 

    public static String getProperty() { 
     return webdavrootDir; 
    } 
} 

Le test:

@BeforeClass 
public static void fakeSystemProperty() { 
    new MockUp<CsvConfig>() { 

     @Mock 
     public String getProperty() { 
      return "https://justatest.com/dav/bulk"; 
     } 
    }; 
}