Spring i kotest - nie mogę uruchomić testów

Spring i kotest - nie mogę uruchomić testów
KK
  • Rejestracja:prawie 17 lat
  • Ostatnio:13 dni
0

Cześć,

z jakiegoś powodu nie mogę uruchomić żadnego testu z kontekstem Springa. Kombinowałem na różne sposoby, za każdym razem jakiś nowy błąd, dlatego proszę Was o pomoc w uruchomieniu testu na nowym, czystym projekcie :)

pom.xml

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>kotlin-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>kotlin-test</name>
	<description>test kotest with spring</description>
	<properties>
		<java.version>17</java.version>
		<kotlin.version>1.6.10</kotlin.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webflux</artifactId>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.module</groupId>
			<artifactId>jackson-module-kotlin</artifactId>
		</dependency>
		<dependency>
			<groupId>io.projectreactor.kotlin</groupId>
			<artifactId>reactor-kotlin-extensions</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.jetbrains.kotlinx</groupId>
			<artifactId>kotlinx-coroutines-reactor</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>io.projectreactor</groupId>
			<artifactId>reactor-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/io.kotest.extensions/kotest-extensions-spring -->
		<dependency>
			<groupId>io.kotest.extensions</groupId>
			<artifactId>kotest-extensions-spring</artifactId>
			<version>1.1.0</version>
			<scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/io.kotest/kotest-runner-junit5 -->
		<dependency>
			<groupId>io.kotest</groupId>
			<artifactId>kotest-runner-junit5</artifactId>
			<version>5.1.0</version>
			<scope>test</scope>
		</dependency>

	</dependencies>

	<build>
		<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
		<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.jetbrains.kotlin</groupId>
				<artifactId>kotlin-maven-plugin</artifactId>
				<configuration>
					<args>
						<arg>-Xjsr305=strict</arg>
					</args>
					<compilerPlugins>
						<plugin>spring</plugin>
					</compilerPlugins>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>org.jetbrains.kotlin</groupId>
						<artifactId>kotlin-maven-allopen</artifactId>
						<version>${kotlin.version}</version>
					</dependency>
				</dependencies>
			</plugin>
		</plugins>
	</build>

</project>

Najprostszy test, nawet bez kontekstu Springa, którego nie mogę uruchomić

Kopiuj
class StupidControllerTest : StringSpec({
    "hello should say hello" {
        true shouldBe true
    }
})

Błąd, który dostaję

Kopiuj
Error: Unable to initialize main class io.kotest.launcher.LauncherKt
Caused by: java.lang.NoClassDefFoundError: io/kotest/core/engine/TestEngineListener

Działający projekt, na któym próbuję się wzorować: github_link

Co robię źle?


jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
1

Niestety, nie miałem dawno styczności i z mavenem, i ze springiem. Ale na stronie kotest piszą, żeby dodać

Kopiuj
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.22.2</version>
</plugin>

Poza tym co to znaczy uruchomić test? Bo, zachodzi podejrzenie, że odpalasz z intellij. I wtedy jest to często inny problem (potrzebny plugin).
Zacznij od odpalania z mavena. Potem z IDE.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
Schadoow
  • Rejestracja:ponad 13 lat
  • Ostatnio:dzień
  • Postów:1068
1

Jeżeli odpalasz z idea zmien Shorten command line na JAR manifest np.

KK
  • Rejestracja:prawie 17 lat
  • Ostatnio:13 dni
0

Dodałem plugin, próbowałem z poziomu mavena ./mvnw test (windows), nie widzi mi tego testu.
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

Zmiana Shorten command line też nie pomaga.

Taki test mogę uruchomić z kontekstem Springa zarówna z IntelliJ, jak i z mavena.

Kopiuj
@SpringBootTest
class KotlinTestApplicationTest {

    @Test
    fun contextLoads() {
    }
}

No ale zależ mi na kotest.

Żeby móc odpalić testy z kotest muszę wywalić kotest-extensions-spring a runnera zamienić na ten z końcówką jvm -> kotest-runner-junit5-jvm
Wtedy testy idą i intellij, i z mavena.

No ale nie mogę wtedy odpalić ich z kontekstem Springa, bo np. taki test

Kopiuj
@SpringBootTest
@AutoConfigureWebTestClient
class StupidControllerTest(
    val webTestClient: WebTestClient
) : StringSpec({
    "hello should say hello" {
        true shouldBe false
    }
})

wywali się z błędem
io.kotest.engine.spec.SpecInstantiationException: Could not create instance of class com.example.kotlintest.StupidControllerTest. Specs must have a public zero-arg constructor.
Próbowałem różnych kombinacji, ale nic nie idzie.


PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
1

A dałeś mu ten domyślny konstruktor, o który się pluje?

Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 17 godzin
  • Postów:1875
1

Rozumiem, że tego juz probowales i nie dziala? https://dev.to/kotest/testing-a-spring-boot-application-with-kotlintest-pgd

Musisz tylko znalezc mavenowe odpowiedniki.

Skoro wywaliłeś kotest-extensions-spring, to nie dziwne, że woła o konstruktor - nie tedy droga.


”Engineering is easy. People are hard.” Bill Coughran
KK
  • Rejestracja:prawie 17 lat
  • Ostatnio:13 dni
0

No nie czaję tego :D

Utworzyłem sobie nowy projekt z gradle. Żeby testy w nim odpalić, musiałem wywalić id("io.spring.dependency-management") version "1.0.11.RELEASE" i ręcznie wklepać wersje w importach.

Kopiuj
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.6.3"
//	id("io.spring.dependency-management") version "1.0.11.RELEASE"
    kotlin("jvm") version "1.6.10"
    kotlin("plugin.spring") version "1.6.10"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-webflux:2.6.3")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1")
    implementation("io.projectreactor.kotlin:reactor-kotlin-extensions:1.1.5")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.6.0")
    testImplementation("org.springframework.boot:spring-boot-starter-test:2.6.3")
    {
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    }
    testImplementation("io.projectreactor:reactor-test:3.4.14")
    testImplementation("io.kotest:kotest-runner-junit5:5.1.0")
    testImplementation("io.kotest.extensions:kotest-extensions-spring:1.1.0")
}


tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "13"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

Porówywałem to z mavenem i nie wiem gdzie leży błąd/różnica. Niestety, muszę to jakoś na mavenie uruchomić, bo te testy chcę dodać do swojego isteniejącego projektu, a tam mam mavena.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.