JpaTest करते समय @SpringBootConfiguration खोजने में असमर्थ


184

मैं चौखटों के लिए नया हूं (बस कक्षा उत्तीर्ण की है) और स्प्रिंग बूट का उपयोग करते हुए यह मेरा पहला अवसर है।

मैं यह देखने के लिए कि क्या मेरे CrudRepositories वास्तव में काम कर रहे हैं, एक साधारण Junit परीक्षण चलाने की कोशिश कर रहा हूँ।

जो त्रुटि मुझे मिल रही है वह है:

@SpringBootConfiguration को खोजने में असमर्थ, आपको अपने परीक्षण java.lang.IlleetStateException के साथ @ContextConfiguration या @SpringBootTest (कक्षाएं = ...) का उपयोग करने की आवश्यकता है

क्या स्प्रिंग बूट स्वयं को कॉन्फ़िगर नहीं करता है?

मेरी परीक्षा कक्षा:

@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);

 }

मेरा स्प्रिंग बूट आवेदन स्टार्टर:

@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);         

        }
    }

मेरा भंडार:

public interface AccountRepository extends CrudRepository<Account,Long> {

    public Account findByUsername(String username);

    }
}

जवाबों:


264

दरअसल, स्प्रिंग बूट अधिकांश भाग के लिए खुद को स्थापित करता है। आप शायद पहले से ही आपके द्वारा पोस्ट किए गए बहुत सारे कोड से छुटकारा पा सकते हैं, विशेष रूप से Application

काश, आपने अपने सभी वर्गों के पैकेज नामों को शामिल किया होता, या कम से कम के लिए Applicationऔर JpaTest@DataJpaTestऔर कुछ अन्य एनोटेशन के बारे में बात यह है कि वे @SpringBootConfigurationवर्तमान पैकेज में एक एनोटेशन की तलाश करते हैं, और यदि वे इसे वहां नहीं पाते हैं, तो वे पैकेज पदानुक्रम को तब तक खोजते हैं जब तक कि वे इसे ढूंढ नहीं लेते।

उदाहरण के लिए, यदि आपके परीक्षण वर्ग के लिए पूरी तरह से योग्य नाम था com.example.test.JpaTestऔर आपके आवेदन के लिए एक था com.example.Application, तो आपका परीक्षण वर्ग @SpringBootApplication(और उसमें @SpringBootConfiguration) खोजने में सक्षम होगा ।

यदि आवेदन पैकेज पदानुक्रम की एक अलग शाखा में रहता है, हालांकि, जैसे com.example.application.Application, यह उसे नहीं मिलेगा।

उदाहरण

निम्नलिखित मावेन परियोजना पर विचार करें:

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
    +--test
      +--com
        +--example
          +--test
            +--JpaTest.java

और फिर निम्नलिखित सामग्री में Application.java:

package com.example;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

की सामग्री द्वारा अनुसरण किया गया JpaTest.java:

package com.example.test;

@RunWith(SpringRunner.class)
@DataJpaTest
public class JpaTest {

    @Test
    public void testDummy() {
    }
}

सब कुछ काम करना चाहिए। आप के अंदर एक नया फ़ोल्डर बनाने तो src/main/com/exampleकहा जाता है app, और फिर अपने डाल Application.javaइसके अंदर (और अद्यतन packageफ़ाइल के अंदर घोषणा), परीक्षण चल रहा है आपको निम्न त्रुटि दे देंगे:

java.lang.IllegalStateException: @SpringBootConfiguration को खोजने में असमर्थ, आपको अपने परीक्षण के साथ @ContextConfiguration या @SpringBootTest (कक्षाएं ... ...) का उपयोग करने की आवश्यकता है


1
अभिवादन, परीक्षण और आवेदन कोड के लिए एक अलग पैकेज के साथ मावेन पैकेट सेटअप का उपयोग करके एक समाधान एम पेश करने के लिए धन्यवाद। अगर मैं सही व्याख्या करता हूं कि आप क्या कह रहे हैं, तो मुझे अपने टेस्ट पैकेज को एप्लिकेशन क्लास को निर्देशित करना होगा? और फिर यह स्प्रिंगकॉन्फिगरेशन को ढूंढ लेगा?
थॉमस बिललेट

यदि "मावेन पैकेट" से आपका मतलब "मॉड्यूल" है, तो हां, जिस मॉड्यूल में आपकी टेस्ट क्लास है, उस मॉड्यूल पर निर्भर रहना Applicationहोगा। यदि, हालांकि, आपका मतलब है src/mainऔर src/testफिर, वे फ़ोल्डर पैकेज का हिस्सा नहीं हैं। पदानुक्रम। शायद आप अपने प्रश्न को स्क्रीनशॉट के साथ अपडेट करने या आपके प्रोजेक्ट संरचना की तरह क्या है, इसका स्पष्टीकरण देने से बेहतर है।
थॉमस केसीन

मैंने आपके कहे अनुसार समस्या का समाधान किया। कुछ गुग्लिंग के बाद मैंने सुझाए गए वसंत पैकेट संरचना को पाया और उन सभी को फिर से तैयार किया। अब परीक्षण अपेक्षानुसार चलते हैं। बहुत बहुत धन्यवाद
थॉमस बिललेट

ठीक है, अच्छा पता है! मैंने वैसे भी अधिक गहन उदाहरण के साथ उत्तर को अद्यतन किया।
थॉमस कासेन

3
+ - परीक्षण + - com + - उदाहरण + - JpaTest.java भी काम करते हैं
user674158

104

कॉन्फ़िगरेशन अनुप्रयोग वर्ग से जुड़ा हुआ है, इसलिए निम्नलिखित सब कुछ सही ढंग से सेट करेगा:

@SpringBootTest(classes = Application.class)

यहाँ JHipster परियोजना से उदाहरण ।


यह सही समाधान प्रतीत होता है। मुझे किसी भी वर्ग या फ़ोल्डर को स्थानांतरित करने की आवश्यकता नहीं है।
अभिषेक अग्रवाल

21

यह जांचने योग्य है कि क्या आपने अपने मुख्य वर्ग के एनोटेट पैकेज का नाम बदल दिया है @SpringBootApplication। उस मामले में टेस्टकेस एक उपयुक्त पैकेज में होना चाहिए अन्यथा पुराने पैकेज में इसकी तलाश की जाएगी। यह मेरे लिए मामला था।


11

थॉमस केसीन ने जो कहा, इसके अलावा, आप भी जोड़ सकते हैं

@SpringBootTest(classes=com.package.path.class)

यदि आप अपनी फ़ाइल पदानुक्रम को फिर से दर्ज नहीं करना चाहते हैं, तो यह निर्दिष्ट करने के लिए परीक्षण एनोटेशन कि यह अन्य वर्ग के लिए कहाँ दिखना चाहिए। यह कहकर त्रुटि संदेश संकेत करता है:

Unable to find a @SpringBootConfiguration, you need to use 
@ContextConfiguration or @SpringBootTest(classes=...) ...

यह बहुत मूल्यवान उत्तर है! धन्यवाद @cameron!
लांस तरह

5

मेरे मामले में एप्लिकेशन और टेस्ट कक्षाओं के बीच पैकेज अलग थे

package com.example.abc;
...
@SpringBootApplication
public class ProducerApplication {

तथा

package com.example.abc_etc;
...
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerApplicationTest {

उन्हें सहमत करने के बाद परीक्षण सही ढंग से चला।


5

यह मेरे लिए काम करता है

उपरोक्त परीक्षण वर्ग के पैकेज का नाम सामान्य वर्ग के पैकेज के नाम के समान ही बदल जाता है।

इसमें बदलाव करें


3

परीक्षण टुकड़ा स्प्रिंग बूट 1.4 लाया में प्रदान की सुविधा उन्मुख परीक्षण क्षमताओं।

उदाहरण के लिए,

@ जसनटेस्ट जैसन क्रमांकन और डीरियलाइजेशन का परीक्षण करने के लिए एक सरल जैक्सन वातावरण प्रदान करता है।

@WebMvcTest एक नकली वेब वातावरण प्रदान करता है, यह परीक्षण के लिए नियंत्रक वर्ग को निर्दिष्ट कर सकता है और परीक्षण में MockMvc को इंजेक्ट कर सकता है।

@WebMvcTest(PostController.class)
public class PostControllerMvcTest{

    @Inject MockMvc mockMvc;

}

@DataJpaTest एक एम्बेडेड डेटाबेस तैयार करेगा और परीक्षण के लिए बुनियादी जेपीए वातावरण प्रदान करेगा।

@RestClientTest टेस्ट के लिए REST क्लाइंट वातावरण प्रदान करता है, espTemplateBuilder आदि।

इन एनोटेशन की रचना स्प्रिंगबूटेस्ट के साथ नहीं की गई है, वे एक श्रृंखला AutoconfigureXXXऔर @TypeExcludesFilterएनोटेशन के साथ संयुक्त हैं ।

एक नजर है @DataJpaTest

@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 {}

आप डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करने के लिए अपने @AutoconfigureXXX एनोटेशन जोड़ सकते हैं।

@AutoConfigureTestDatabase(replace=NONE)
@DataJpaTest
public class TestClass{
}

आपकी समस्या पर एक नजर डालते हैं,

  1. मिश्रण न करें @DataJpaTestऔर @SpringBootTestजैसा कि ऊपर कहा गया है @DataJpaTest, कॉन्फ़िगरेशन को अपने तरीके से बनाएगा (जैसे कि डिफ़ॉल्ट रूप से, यह एप्लिकेशन कॉन्फ़िगरेशन वंशानुक्रम से एक एम्बेडेड H2 को तैयार करने का प्रयास करेगा)। परीक्षण टुकड़ा के@DataJpaTest लिए नामित किया गया है ।
  2. यदि आप के कॉन्फ़िगरेशन को अनुकूलित करना चाहते हैं @DataJpaTest, तो कृपया इस विषय के लिए Spring.io से आधिकारिक ब्लॉग प्रविष्टि पढ़ें , (थोड़ा थकाऊ)।
  3. Applicationसुविधाओं जैसे कि WebConfig, DataJpaConfigआदि के द्वारा छोटे विन्यास में विन्यास को विभाजित करें । एक पूर्ण विशेषताओं वाला विन्यास (मिश्रित वेब, डेटा, सुरक्षा आदि) भी आपके परीक्षण के स्लाइस आधारित परीक्षणों में विफल रहा। मेरे नमूने में परीक्षण के नमूनों की जाँच करें ।

1

मुझे लगता है कि इस मुद्दे के लिए सबसे अच्छा समाधान आपके परीक्षण फ़ोल्डर संरचना को एप्लिकेशन फ़ोल्डर संरचना के साथ संरेखित करना है।

मेरे पास एक ही मुद्दा था जो एक अलग फ़ोल्डर संरचना परियोजना से मेरी परियोजना की नकल करने के कारण हुआ था।

यदि आपकी परीक्षण परियोजना और आपकी एप्लिकेशन परियोजना में समान संरचना होगी, तो आपको अपने परीक्षण वर्गों में कोई विशेष एनोटेशन जोड़ने की आवश्यकता नहीं होगी और सब कुछ उसी तरह काम करेगा।


मेरे पास एक ही त्रुटि थी और मुझे अंततः पता चला कि परीक्षण वर्ग के पैकेज के नाम में "नियम" के स्थान पर एक टाइपो "नियम" था। पैकेज का नाम तय करने के बाद, त्रुटि दूर हो गई।
गोपाल बैरवा

1

जब सभी कक्षाएं एक ही पैकेज में थीं, परीक्षण कक्षाएं काम कर रही थीं। जैसे ही मैंने उचित परियोजना संरचना को बनाए रखने के लिए सभी जावा कक्षाओं को अलग-अलग पैकेज में स्थानांतरित किया, मुझे वही त्रुटि मिल रही थी।

मैंने नीचे की तरह टेस्ट क्लास में अपना मुख्य वर्ग नाम प्रदान करके इसे हल किया।

@SpringBootTest(classes=JunitBasicsApplication.class)

1

मेरे पास एक ही मुद्दा था और मैंने SpringBootApplicationफ़ोल्डर src / test / java के मूल पैकेज में एनोटेट के साथ खाली वर्ग जोड़कर हल किया

package org.enricogiurin.core;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CoreTestConfiguration {}

0

मेरे मामले में
मेक सुनिश्चित करें कि आपके ( test packageनाम ) का YourApplicationTests(के बराबर है main packageनाम )।


-2
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;



@RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest
@AutoConfigureWebMvc
public class RepoTest {

    @Autowired
    private ThingShiftDetailsRepository thingShiftDetailsRepo;

    @Test
    public void findThingShiftDetails() {
            ShiftDetails details = new ShiftDetails();
            details.setThingId(1);

            thingShiftDetailsRepo.save(details);

            ShiftDetails dbDetails = thingShiftDetailsRepo.findByThingId(1);
            System.out.println(dbDetails);
    }
}

ऊपर के एनोटेशन ने मेरे लिए अच्छा काम किया। मैं जेपीए के साथ स्प्रिंग बूट का उपयोग कर रहा हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.