Search in sources :

Example 1 with EmbeddedApplication

use of io.micronaut.runtime.EmbeddedApplication in project micronaut-test by micronaut-projects.

the class AbstractMicronautExtension method beforeClass.

/**
 * Executed before tests within a class are run.
 *
 * @param context The test context
 * @param testClass The test class
 * @param testAnnotationValue The test annotation values
 */
protected void beforeClass(C context, Class<?> testClass, @Nullable MicronautTestValue testAnnotationValue) {
    if (testAnnotationValue != null) {
        Class<? extends ApplicationContextBuilder>[] cb = testAnnotationValue.contextBuilder();
        if (ArrayUtils.isNotEmpty(cb)) {
            this.builder = InstantiationUtils.instantiate(cb[0]);
        }
        this.testAnnotationValue = testAnnotationValue;
        final Package aPackage = testClass.getPackage();
        builder.packages(aPackage.getName());
        final List<Property> ps = AnnotationUtils.findRepeatableAnnotations(testClass, Property.class);
        for (Property property : ps) {
            testProperties.put(property.name(), property.value());
        }
        String[] propertySources = testAnnotationValue.propertySources();
        if (ArrayUtils.isNotEmpty(propertySources)) {
            Map<String, PropertySourceLoader> loaderMap = readPropertySourceLoaderMap();
            ResourceResolver resourceResolver = new ResourceResolver();
            for (String propertySource : propertySources) {
                String ext = NameUtils.extension(propertySource);
                if (StringUtils.isNotEmpty(ext)) {
                    String filename = NameUtils.filename(propertySource);
                    PropertySourceLoader loader = loaderMap.get(ext);
                    if (loader != null) {
                        Optional<InputStream> resourceAsStream = resourceResolver.getResourceAsStream(propertySource);
                        InputStream inputStream = resourceAsStream.orElse(testClass.getResourceAsStream(propertySource));
                        if (inputStream != null) {
                            Map<String, Object> properties;
                            try {
                                properties = loader.read(filename, inputStream);
                                builder.propertySources(PropertySource.of(filename, properties));
                            } catch (IOException e) {
                                throw new RuntimeException("Error loading property source reference for @MicronautTest: " + filename);
                            } finally {
                                try {
                                    inputStream.close();
                                } catch (IOException e) {
                                // ignore
                                }
                            }
                        }
                    }
                }
            }
        }
        if (TestPropertyProvider.class.isAssignableFrom(testClass)) {
            resolveTestProperties(context, testAnnotationValue, testProperties);
        }
        testProperties.put(TestActiveCondition.ACTIVE_SPEC_CLAZZ, testClass);
        testProperties.put(TEST_ROLLBACK, String.valueOf(testAnnotationValue.rollback()));
        testProperties.put(TEST_TRANSACTIONAL, String.valueOf(testAnnotationValue.transactional()));
        testProperties.put(TEST_TRANSACTION_MODE, String.valueOf(testAnnotationValue.transactionMode()));
        final Class<?> application = testAnnotationValue.application();
        if (application != void.class) {
            builder.mainClass(application);
        }
        String[] environments = testAnnotationValue.environments();
        if (environments.length == 0) {
            environments = new String[] { "test" };
        }
        builder.packages(testAnnotationValue.packages()).environments(environments);
        PropertySource testPropertySource = PropertySource.of(TEST_PROPERTY_SOURCE, testProperties);
        builder.propertySources(testPropertySource);
        postProcessBuilder(builder);
        this.applicationContext = builder.build();
        startApplicationContext();
        specDefinition = applicationContext.findBeanDefinition(testClass).orElse(null);
        if (testAnnotationValue.startApplication() && applicationContext.containsBean(EmbeddedApplication.class)) {
            embeddedApplication = applicationContext.getBean(EmbeddedApplication.class);
            embeddedApplication.start();
        }
        refreshScope = applicationContext.findBean(RefreshScope.class).orElse(null);
    }
}
Also used : InputStream(java.io.InputStream) PropertySourceLoader(io.micronaut.context.env.PropertySourceLoader) IOException(java.io.IOException) PropertySource(io.micronaut.context.env.PropertySource) ResourceResolver(io.micronaut.core.io.ResourceResolver) Property(io.micronaut.context.annotation.Property) ApplicationContextBuilder(io.micronaut.context.ApplicationContextBuilder) EmbeddedApplication(io.micronaut.runtime.EmbeddedApplication)

Aggregations

ApplicationContextBuilder (io.micronaut.context.ApplicationContextBuilder)1 Property (io.micronaut.context.annotation.Property)1 PropertySource (io.micronaut.context.env.PropertySource)1 PropertySourceLoader (io.micronaut.context.env.PropertySourceLoader)1 ResourceResolver (io.micronaut.core.io.ResourceResolver)1 EmbeddedApplication (io.micronaut.runtime.EmbeddedApplication)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1