Ich bin neu in Frameworks (habe gerade die Klasse bestanden) und benutze Spring Boot zum ersten Mal.
Ich versuche, einen einfachen Junit-Test durchzuführen, um festzustellen, ob meine CrudRepositories tatsächlich funktionieren.
Der Fehler, den ich immer wieder bekomme, ist:
Sie können keine @SpringBootConfiguration finden und müssen @ContextConfiguration oder @SpringBootTest (classes = ...) mit Ihrem Test java.lang.IllegalStateException verwenden
Konfiguriert sich Spring Boot nicht selbst?
Meine Testklasse:
@RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class JpaTest {
@Autowired
private AccountRepository repository;
@After
public void clearDb(){
repository.deleteAll();
}
@Test
public void createAccount(){
long id = 12;
Account u = new Account(id,"Tim Viz");
repository.save(u);
assertEquals(repository.findOne(id),u);
}
@Test
public void findAccountByUsername(){
long id = 12;
String username = "Tim Viz";
Account u = new Account(id,username);
repository.save(u);
assertEquals(repository.findByUsername(username),u);
}
Mein Spring Boot-Anwendungsstarter:
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"domain.repositories"})
@ComponentScan(basePackages = {"controllers","domain"})
@EnableWebMvc
@PropertySources(value {@PropertySource("classpath:application.properties")})
@EntityScan(basePackages={"domain"})
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
Mein Repository:
public interface AccountRepository extends CrudRepository<Account,Long> {
public Account findByUsername(String username);
}
}
quelle
Application
in ist. Wenn jedoch meinen Siesrc/main
undsrc/test
dann die Ordner sind nicht Teil des Pakets Hierarchie. Vielleicht ist es besser, wenn Sie Ihre Frage nur mit einem Screenshot oder einer Erklärung Ihrer Projektstruktur aktualisieren.Die Konfiguration ist an die Anwendungsklasse angehängt, sodass im Folgenden alles korrekt eingerichtet wird:
Beispiel aus dem JHipster-Projekt hier .
quelle
Es lohnt sich zu überprüfen, ob Sie den Paketnamen Ihrer Hauptklasse mit Anmerkungen versehen haben
@SpringBootApplication
. In diesem Fall sollte sich der Testfall in einem geeigneten Paket befinden, andernfalls wird er im älteren Paket gesucht. das war bei mir der Fall.quelle
Zusätzlich zu dem, was Thomas Kåsene gesagt hat, können Sie auch hinzufügen
in der Testanmerkung, um anzugeben, wo nach der anderen Klasse gesucht werden soll, wenn Sie Ihre Dateihierarchie nicht umgestalten möchten. Dies ist, was die Fehlermeldung andeutet, indem sie sagt:
quelle
In meinem Fall waren die Pakete zwischen den Anwendungs- und Testklassen unterschiedlich
und
Nachdem sie sich einig waren, liefen die Tests korrekt.
quelle
Es funktioniert für mich
Der Paketname der obigen Testklasse wird in den Paketnamen der normalen Klasse geändert.
ändern Sie dies
quelle
Die Testscheibe im Frühjahr Boot - 1.4 gebracht versehen Features orientierte Testfähigkeiten.
Beispielsweise,
@JsonTest bietet eine einfache Jackson-Umgebung zum Testen der JSON-Serialisierung und -Deserialisierung.
@WebMvcTest bietet eine nachgebildete Webumgebung, in der die Controller-Klasse für den Test angegeben und der MockMvc in den Test eingefügt werden kann.
@DataJpaTest bereitet eine eingebettete Datenbank vor und bietet eine grundlegende JPA-Umgebung für den Test.
@RestClientTest bietet eine REST-Client-Umgebung für den Test, insbesondere den RestTemplateBuilder usw.
Diese Anmerkungen werden nicht mit SpringBootTest erstellt, sondern mit einer Reihe von
AutoconfigureXXX
und einer@TypeExcludesFilter
Anmerkung kombiniert .Schau es dir an
@DataJpaTest
.Sie können Ihre Annotation @AutoconfigureXXX hinzufügen, um die Standardkonfiguration zu überschreiben.
Schauen wir uns Ihr Problem an.
@DataJpaTest
und erstellen Sie@SpringBootTest
, wie oben erwähnt@DataJpaTest
, die Konfiguration auf ihre eigene Weise (z. B. wird standardmäßig versucht, stattdessen ein eingebettetes H2 vorzubereiten) aus der Vererbung der Anwendungskonfiguration.@DataJpaTest
ist für Testscheibe bestimmt .@DataJpaTest
, lesen Sie bitte diesen offiziellen Blogeintrag von Spring.io zu diesem Thema (etwas langweilig).Application
in kleinere Konfigurationen von Features, wieWebConfig
,DataJpaConfig
etc. Eine voll funktionsfähige Konfiguration (Misch Web, Daten, Sicherheit usw.) auch Ihre verursacht Testscheibe basierte Tests nicht bestanden. Überprüfen Sie die Testproben in meiner Probe .quelle
Ich denke, dass die beste Lösung für dieses Problem darin besteht, die Struktur Ihrer Testordner an der Struktur der Anwendungsordner auszurichten.
Ich hatte das gleiche Problem, das durch das Duplizieren meines Projekts aus einem anderen Ordnerstrukturprojekt verursacht wurde.
Wenn Ihr Testprojekt und Ihr Anwendungsprojekt dieselbe Struktur haben, müssen Sie Ihren Testklassen keine speziellen Anmerkungen hinzufügen, und alles funktioniert wie es ist.
quelle
Wenn sich alle Klassen im selben Paket befanden, funktionierten die Testklassen. Sobald ich alle Java-Klassen in ein anderes Paket verschoben habe, um die richtige Projektstruktur beizubehalten, wurde der gleiche Fehler angezeigt.
Ich habe es gelöst, indem ich meinen Hauptklassennamen in der Testklasse wie unten angegeben habe.
quelle
Ich hatte das gleiche Problem und löste es durch Hinzufügen einer leeren Klasse, die
SpringBootApplication
im Stammpaket des Ordners src / test / java mit Anmerkungen versehen istquelle
In meinem Fall
Stellen Sie sicher, dass Ihr (
test package
Name ) vonYourApplicationTests
dem (main package
Namen ) entspricht.quelle
Die obigen Anmerkungen haben bei mir gut funktioniert. Ich benutze Spring Boot mit JPA.
quelle