wake-up-neo.com

@SpringBootConfiguration kann nicht gefunden werden, wenn ein JpaTest durchgeführt wird

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

115
Thomas Billet

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.

Beispiel

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

181
Thomas Kåsene

Die Konfiguration ist an die Anwendungsklasse angehängt, daher wird Folgendes korrekt eingerichtet:

@SpringBootTest(classes = Application.class)

Beispiel aus dem JHipster-Projekt hier .

58
mrts

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.

13
Mohammed Rafeeq

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=...) ...
6
Cameron Gagnon

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.

  1. Mischen Sie @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.
  2. Wenn Sie die Konfiguration von @DataJpaTest anpassen möchten, lesen Sie diesen offiziellen Blogeintrag von Spring.io für dieses Thema (ein wenig langweilig).
  3. Teilen Sie die Konfigurationen in 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 .
2
Hantsy

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

1
hang gao

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.

0
silver

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.

0
Nick