J'essaie d'écrire des tests pour une classe qui a une valeur de champ injectée à partir d'un fichier de propriétés. J'essaie d'utiliser l'annotation TestPropertySource
pour obtenir des valeurs lors de l'exécution de tests TestNG, mais il semble ignorer mon fichier de propriétés.Test TestNG n'utilisant pas TestPropertySource pour l'injection de @Value
Il y a des dizaines de questions similaires, que j'ai essayé de lire attentivement et d'essayer leurs implémentations lorsque c'est possible. Il semble ma question est encore un peu différent cependant, voici pourquoi:
« @TestPropertSource and @PropertySource don't work for JUnit »: parle de JUnit au lieu de TestNG (pourrait ou non être pertinent?) Et il parle aussi de l'injection d'une valeur de la propriété dans un champ sur la classe test (par opposition à l'unité testée).
"@TestPropertySource not working?": explique comment ignorer les propriétés manquantes et non comment les réparer.
« @TestPropertySource is not loading properties »: parle aussi injecter des valeurs dans les champs de classe de test (ou ont essayé
@RunWith
@SpringBootTest
mais cela n'a pas aidé non plus).Les autres liens dans Google search results n'a également pas aidé.
Qu'est-ce que vous devez faire pour obtenir une unité sous test avec @Value
champs annotés fixés avec leurs biens? Puis-je en quelque sorte demander au printemps de me fournir des instances de ma classe au lieu de les utiliser moi-même?
Voici un repro minimal.
foo.java
package nl.jeroenheijmans.stackoverflow.testngprops;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Foo {
@Value("${my.prop}")
private String myProp;
public String ExposeProp() {
return myProp;
}
}
FooTest.java
package nl.jeroenheijmans.stackoverflow.testngprops;
import org.springframework.test.context.TestPropertySource;
import org.testng.Assert;
import org.testng.annotations.Test;
@TestPropertySource("classpath:application.properties")
public class FooTest {
@Test
public void sanityCheck(){
Foo foo = new Foo();
Assert.assertNotNull(foo); // Success!
}
@Test
public void testProperty() {
Foo foo = new Foo();
Assert.assertEquals(foo.ExposeProp(), "checkcheck"); // Fail!
}
}
application.properties (à la fois dans le dossier main
et test
)
my.prop=checkcheck
Main.java
package nl.jeroenheijmans.stackoverflow.testngprops;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
@PropertySource(value = {"classpath:application.properties"})
public class Main extends SpringBootServletInitializer {
public static void main(String... args) {
SpringApplication.run(Main.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Main.class);
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>nl.jeroenheijmans.stackoverflow</groupId>
<artifactId>testngprops</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${org.springframework.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<java.version>1.8</java.version>
<maven.compiler.version>3.5</maven.compiler.version>
<org.springframework.boot.version>1.5.1.RELEASE</org.springframework.boot.version>
<testng.version>6.9.10</testng.version>
<mockito.version>1.9.5</mockito.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
Thx pour la réponse, va vérifier dans un peu. (Je suis déconcerté par la façon dont Mongo apparaît, n'a pas réalisé qu'il ya des dépendances liées mongo dans la chaîne quelque part.) – Jeroen
@Jeroen - S'il vous plaît ne pas oublier d'accepter la réponse, si elle a répondu à votre question. –
Le '' @ SpringBootTest' + ... + étend AbstractTestNGSpringContextTests' '@ propriété AutoWired' a fait l'affaire. Les trucs de Mongo, les trucs de Logback et les trucs de Log4j n'étaient pas nécessaires pour passer mes tests. – Jeroen