Ich bin neu in Frameworks (die Klasse gerade bestanden) und dies ist das erste Mal, dass ich Springboot benutze.
Ich versuche, einen einfachen Junit-Test auszuführen, um zu sehen, ob meine CrudRepositories tatsächlich funktionieren.
Der Fehler, den ich immer wieder bekomme, ist:
Kann keine @SpringBootConfiguration finden, müssen Sie @ContextConfiguration oder @SpringBootTest (classes = ...) mit Ihrem Test. Java.lang.IllegalStateException
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-Startanwender
@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);
}
}
danke im Voraus
Tatsächlich stellt Spring Boot sich zum größten Teil selbst ein. Sie können wahrscheinlich bereits einen Großteil des Codes entfernen, den Sie gepostet haben, insbesondere in Application
.
Ich wünschte, Sie hätten die Paketnamen aller Ihrer Klassen oder zumindest die für Application
und JpaTest
angegeben. Die Sache mit @DataJpaTest
und einigen anderen Anmerkungen ist, dass sie im aktuellen Paket nach einer @SpringBootConfiguration
-Anmerkung suchen. Wenn sie sie dort nicht finden, durchlaufen sie die Pakethierarchie, bis sie sie finden.
Wenn der vollqualifizierte Name für Ihre Testklasse beispielsweise com.example.test.JpaTest
und der für Ihre Anwendung com.example.Application
lautet, kann Ihre Testklasse den @SpringBootApplication
(und darin den @SpringBootConfiguration
) finden.
Wenn sich die Anwendung jedoch in einem anderen Zweig der Pakethierarchie befunden hat, z. B. com.example.application.Application
, würde sie nicht finden.
Betrachten Sie das folgende Maven-Projekt:
my-test-project
+--pom.xml
+--src
+--main
+--com
+--example
+--Application.Java
+--test
+--com
+--example
+--test
+--JpaTest.Java
Und dann den folgenden Inhalt in Application.Java
:
package com.example;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Gefolgt von den Inhalten von JpaTest.Java
:
package com.example.test;
@RunWith(SpringRunner.class)
@DataJpaTest
public class JpaTest {
@Test
public void testDummy() {
}
}
Alles sollte funktionieren. Wenn Sie einen neuen Ordner in src/main/com/example
mit dem Namen app
erstellen und dann Ihren Application.Java
in den Ordner einfügen (und die package
-Deklaration in der Datei aktualisieren), wird beim Ausführen des Tests der folgende Fehler angezeigt:
Java.lang.IllegalStateException: @SpringBootConfiguration kann nicht gefunden werden. Sie müssen @ContextConfiguration oder @SpringBootTest (classes = ...) für Ihren Test verwenden
Die Konfiguration ist an die Anwendungsklasse angehängt, daher wird Folgendes korrekt eingerichtet:
@SpringBootTest(classes = Application.class)
Beispiel aus dem JHipster-Projekt hier .
Es lohnt sich zu prüfen, ob Sie den Paketnamen Ihrer Hauptklasse mit @SpringBootApplication
kommentiert haben. In diesem Fall sollte sich der Testfall in einem geeigneten Paket befinden, ansonsten wird er im älteren Paket gesucht. das war für mich der Fall.
Zusätzlich zu dem, was Thomas Kåsene gesagt hat, können Sie noch etwas hinzufügen
@SpringBootTest(classes=com.package.path.class)
in der Testanmerkung, um anzugeben, wo nach der anderen Klasse gesucht werden soll, wenn Sie die Dateibaumhierarchie nicht ändern Darauf deutet die Fehlermeldung hin:
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) ...
Das in Spring Boot 1.4 bereitgestellte test-Segment brachte die auf feature ausgerichteten Testfunktionen mit.
Zum Beispiel,
@JsonTest bietet eine einfache Jackson-Umgebung zum Testen der Serialisierung und Deserialisierung von Json.
@WebMvcTest stellt eine Scheinwebumgebung bereit. Sie kann die Controller-Klasse für den Test angeben und MockMvc in den Test einfügen.
@WebMvcTest(PostController.class)
public class PostControllerMvcTest{
@Inject MockMvc mockMvc;
}
@DataJpaTest bereitet eine eingebettete Datenbank vor und bietet eine grundlegende JPA-Umgebung für den Test.
@RestClientTest stellt die Clientumgebung REST für den Test bereit, insbesondere den RestTemplateBuilder usw.
Diese Anmerkungen werden nicht mit SpringBootTest erstellt. Sie werden mit einer Reihe von AutoconfigureXXX
- und @TypeExcludesFilter
-Anmerkungen kombiniert.
Schauen Sie sich @DataJpaTest
an.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(DataJpaTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public @interface DataJpaTest {}
Sie können Ihre @AutoconfigureXXX-Anmerkung hinzufügen, um die Standardkonfiguration zu überschreiben.
@AutoConfigureTestDatabase(replace=NONE)
@DataJpaTest
public class TestClass{
}
Werfen wir einen Blick auf Ihr Problem.
@DataJpaTest
und @SpringBootTest
nicht, da @DataJpaTest
die Konfiguration auf eigene Weise erstellt (z. B. standardmäßig versucht, ein eingebettetes H2 vorzubereiten), und zwar aus der Vererbung der Anwendungskonfiguration. @DataJpaTest
ist für test slice festgelegt.@DataJpaTest
anpassen möchten, lesen Sie diesen offiziellen Blogeintrag von Spring.io für dieses Thema (ein wenig langweilig).Application
in kleinere Konfigurationen auf, indem Sie Funktionen wie WebConfig
, DataJpaConfig
usw. verwenden. Bei einer Konfiguration mit full-Funktionen (gemischtes Web, Daten, Sicherheit usw.) sind auch Ihre Tests auf test Slice -Projekte fehlgeschlagen. Überprüfen Sie das Testmuster in mein Beispiel .Es funktioniert bei mir
der Paketname der obigen Testklasse wird in den gleichen Namen wie der Paketname der normalen Klasse geändert.
change to this
Ich denke, dass die beste Lösung für dieses Problem ist, Ihre Testordnerstruktur an der Anwendungsordnerstruktur auszurichten.
Ich hatte das gleiche Problem, das durch das Duplizieren meines Projekts aus einem anderen Ordnerstrukturprojekt verursacht wurde.
wenn Ihr Testprojekt und Ihr Anwendungsprojekt die gleiche Struktur haben, müssen Sie keine speziellen Anmerkungen zu Ihren Testklassen hinzufügen.
In meinem Fall waren die Pakete zwischen den Klassen Application und Test unterschiedlich
package com.example.abc;
...
@SpringBootApplication
public class ProducerApplication {
und
package com.example.abc_etc;
...
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerApplicationTest {
Nachdem sie sich geeinigt hatten, liefen die Tests korrekt.