Cześć. Ostatnimi czasy postanowiłem się nauczyć używać Springa. Przez większość czasu szło bez problemów, dopóki nie zachciało mi się przetestować mojego repozytorium. Otóż udało mi się napisać taką klasę (nie zwracajcie uwagi na metodę testową) :
@SpringBootTest(classes = DomainInfrastructureTestConfiguration.class)
@RunWith(SpringRunner.class)
@TestPropertySource(locations="classpath:test.properties")
@EntityScan(basePackages = "dnd.helper.domain.infrastructure")
public class AdventurerRepositoryServiceTestIT {
@Autowired
private AdventurerRepository adventurerRepository;
@Test
public void shouldPersistAdventurer() {
Adventurer adventurer = FakeAdventurer.getAdventurerWithAllFields();
adventurerRepository.saveAdventurer(adventurer);
}
}
No i generalnie to jest super, po odpaleniu testu spring boot wstaje, załączają się beany i wykonuje się test. I tutaj pojawia się pierwszy problem - jak odpalę testy z palca, to działają, natomiast ja chciałbym je odpalać podczas budowania projektu mavenem, lub podczas odpalania głównej aplikacji spring bootowej.
Po szybkim researchu w sieci, odnalazłem plugin spring-boot-maven-plugin. No więc na szybkości dodałem sobie dwa wpisy do pomów - pierwszy do modułu application, drugi do modułu domain-infrastructure (klasa startująca aplikację springbootową jest w innym module niż repozytorium):
<profiles>
<profile>
<id>IT</id>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<skip>false</skip>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
<configuration>
<skip>false</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<profiles>
<profile>
<id>IT</id>
<build>
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<includes>
<include>**/*IT</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Na koniec odpalam clean install -P IT i okazuje się, że test nie został wykonany. Jestem na 99% przekonany, że to przez konfigurację w pomach - moduł application odpala springa podczas fazy wykonywania testów integracyjnych, ale te testy są skonfigurowane w innym module.
I tutaj pojawia się pytanie - w jaki sposób napisać to, żeby zadziałało? Od razu uprzedzę pytania - nie mogę przenieść spring-boot-maven-plugin do modułu domain-infrastructure, bo nie mam w nim zależności do application i plugin nie może odnaleźć klasy startującej springboota.
Shalom