Как внедрить bean-компонент Spring в тестовый класс JUnit 5, написанный на Kotlin? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь что-то протестировать в проекте Kotlin, используя JUnit 5 и Spring Boot, но я не могу внедрить bean-компонент в мой тестовый класс.

Я пробовал много разных аннотаций, но инъекция работала ...

Вот мой тестовый класс:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
@ExtendWith(SpringExtension::class)
class FooTest {

   @Autowired
   lateinit var repo: BarRepository

   @BeforeAll
   fun setup() {
   }

   @Test
   fun testToto() {
   }
}

При этой комбинации аннотаций код вызывает следующее исключение: java.lang.NoClassDefFoundError:org/springframework/boot/context/properties/source/ConfigurationPropertySource. И я на самом деле не могу найти, откуда происходит это исключение ... Я пытался провести какое-то исследование об этом исключении, но я не нашел ничего удовлетворительного ...

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я наконец нашел, как исправить мою проблему. Первоначально моя версия Spring Boot была «1.5.3», поэтому я изменил свой pom.xml на версию «2.0.2». Теперь мои тесты выполняются нормально, и мой бин вводится правильно, как и ожидалось. Вот модифицированная часть моего pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/>
</parent>

Все нормально после изменения версии. Вот полезные зависимости для тестирования с помощью Junit:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <scope>test</scope>
</dependency>
0 голосов
/ 10 января 2019

Я полагаю, у вас есть ошибка в ваших зависимостях. Если вы сгенерируете новый проект Spring Boot Kotlin из https://start.spring.io/#!language=kotlin, то настройте свои зависимости следующим образом, он будет работать как положено:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-reflect</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <artifactId>junit</artifactId>
                <groupId>junit</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Также обратите внимание, что вам не нужно указывать @ExtendWith(SpringExtension::class), поскольку @SpringBootTest уже содержит мета-аннотации с этой аннотацией в Spring Boot 2.1.

...