Ich habe eine Spring Boot-Anwendung mit der folgenden Hauptklasse:
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Jetzt möchte ich meine Dienste testen und eine Basistestklasse erstellen:
@SpringApplicationConfiguration(Application.class)
public abstract class TestBase {
}
Wenn ich meinen Test durchführe, erhalte ich eine Ausnahme:
Caused by: Java.lang.IllegalArgumentException: Can not load an ApplicationContext with a NULL 'contextLoader'. Consider annotating your test class with @ContextConfiguration.
at org.springframework.util.Assert.notNull(Assert.Java:115)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.Java:117)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.Java:148)
Dann ändere ich meine Basistestklasse mit ContextConfiguration
@ContextConfiguration(classes = Application.class)
public abstract class TestBase {
}
Dieses Mal erhalte ich einen DataSource-Initialisierungsfehler. Ich frage mich, warum es im ersten Fall fehlschlägt und warum im zweiten Fall meine application.properties nicht geladen wird, in die ich die Datenquelle konfiguriert habe.
Vielen Dank!
Sowas in der Art:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ApplicationTest{
@Autowire
Foo foo //whatever you are testing
@Test
public void FooTest() throws Exception{
Foo f = foo.getFooById("22");
assertEquals("9B". f.getCode);
}
//TODO look into MockMVC for testing services
}
Beispiel zum Testen mit
Sie werden das alles nicht so einfach finden wie unten :) Es hat lange gedauert, es herauszufinden.
Konfiguration:
@TestConfiguration
@PropertySource(value = "classpath:test.properties", encoding = "UTF-8")
public class GlobalConfig {
@Bean(name = "JsonMapper")
public JsonMapper jsonMapper() {
return new JsonMapper();
}
@Bean(name = "ObjectMapper")
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
@Bean(name = "Mapper")
public Mapper dozer() {
return new DozerBeanMapper();
}
@Bean(name = "Validator")
public Validator validator() {
return new DefaultValidatorAdapter();
}
}
Aktuelle Testdatei:
import freemarker.template.Configuration;
import global.GlobalConfig;
import org.Apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import Java.io.File;
import Java.nio.file.Files;
import Java.nio.file.Paths;
import Java.util.Arrays;
import Java.util.List;
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {GlobalConfig.class, MessagePersistManager.class, TemplateManager.class, FileOperationsManager.class, Configuration.class})
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MessagePersistManagerTest {
@Autowired
private MessagePersistManager messagePersistManager;
@Autowired
private TemplateManager templateManager;
@Autowired
private FileOperationsManager fileOperationsManager;
@Autowired
private Configuration freemarkerConfiguration;
@Value("${channel.outbound.ftp.local.directory}")
private String sepaFilesBasePath;
@BeforeAll
private void init() throws Exception {
System.out.println("Creating Base Dir=" + sepaFilesBasePath);
Files.createDirectories(Paths.get(sepaFilesBasePath));
/* FreeMarker Configuration */
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/templates/");
}
@AfterAll
private void destroy() throws Exception {
System.out.println("Deleting Base Dir=" + sepaFilesBasePath);
FileUtils.deleteDirectory(new File(sepaFilesBasePath));
}
@Test
void persistSepaFile() {
messagePersistManager.persistSepaFile("sepaWinnings.xml", generateData());
System.out.println("e");
assert (true);
}
Sie sollten Initialisierer verwenden.
Bitte beziehen Sie sich auf die unten stehenden Fragen.
Federtest füllt die Datenbankkonfiguration nicht von application.properties aus
Spring boot, yml-Eigenschaften über Integrationstestfall lesen
Ich war mit dem gleichen Problem konfrontiert, weil mein ServletInitializer in einem anderen Paket enthalten war. Problem behoben, nachdem die Paketstruktur korrigiert wurde.