wake-up-neo.com

Spring Boot-Testkonfiguration

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!

11
sansari

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
}
6
Drew1208

Beispiel zum Testen mit

  • Spring Boot
  • Spring Boot Test Konfiguration
  • JUnit 5
  • FreeMarker

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);
    }
5
GOXR3PLUS
2
zeagord

Ich war mit dem gleichen Problem konfrontiert, weil mein ServletInitializer in einem anderen Paket enthalten war. Problem behoben, nachdem die Paketstruktur korrigiert wurde.

0
Deepak Bhatia