Как создать groovy.sql.Sql с параметрами из настройки источника данных Spring из test application.yml в тестовом контексте приложения SpringBoot? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть проект SpringBoot maven, и у него есть подмодуль jar, связанный с репозиторием, который хранит связанные с БД исполнения, классы репозитория с JdbcTemplate и т. Д.

Я хочу протестировать базу данных с помощью SpockGroovy.

Это мой 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>

...

Это application.yml из 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

Это конфигурация приложения в main / java / mypackage :

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class RepositoryConfig {

}

Это groovy test spec , который должен настроить 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()
    }

}

Но здесь я получаю NullPointerException, поскольку все свойства имеют значение null (url, driverClassName и т. Д.) . И я не знаю, как получить их из свойств yml в текстовом контексте.

Есть идеи? Спасибо.

Цитата

1 Ответ

1 голос
/ 11 октября 2019

Вы никогда не говорите Spring на самом деле ввести эти значения. Добавление аннотаций @Value к вашим полям должно решить вашу проблему. Например:

@Value("#{spring.datasource.url}")
String url
...