mercredi 9 octobre 2019

How to instantiate groovy.sql.Sql with parameters from spring datasource setup from test application.yml in a SpringBoot application test context?

I have a SpringBoot maven project, and it has a repository related jar sub-module, which stores the DB related executions, the repository classes with JdbcTemplate and etc.

I want to test the database with Spock Groovy.

This is my pom.xml:

...

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
    </dependency>

    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
    </dependency>

    <!-- Spock Dependencies -->
    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-spring</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- enables mocking of classes (in addition to interfaces) -->
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- enables mocking of classes without default constructor (together with CGLIB) -->
    <dependency>
        <groupId>org.objenesis</groupId>
        <artifactId>objenesis</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy.modules.http-builder</groupId>
        <artifactId>http-builder</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- Spock End -->
</dependencies>

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*Spec.*</include>
                    <include>**/*Test.*</include>
                </includes>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.gmavenplus</groupId>
            <artifactId>gmavenplus-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>test-jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

...

This is the application.yml from test/resources:

spring:
  datasource:
    platform: sqlserver
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://localhost;databaseName=mydatabase;integratedSecurity=true

server:
  address: 127.0.0.1
  port: 9000

This is the application config in main/java/mypackage:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class RepositoryConfig {

}

This is the groovy test spec which should setup the groovy.sql.Sql:

@SpringBootTest(classes = RepositoryConfig.class, webEnvironment = WebEnvironment.MOCK)
@Configuration
@EnableConfigurationProperties
@Transactional
class BaseSpringBootTestSpec extends Specification {

    String url
    String username
    String password
    String driverClassName

    protected groovy.sql.Sql sql

    def setup() {
        sql = groovy.sql.Sql.newInstance(url, username, password, driverClassName)
    }

    def cleanup() {
        sql.close()
    }

}

But here I get NullPointerException because the properties are all null (url, driverClassName, etc). And I don't know how to get them from yml properties in text context.

Any idea? Thanks.

Blockquote

Aucun commentaire:

Enregistrer un commentaire