জেপএস্টেস্ট করার সময় @ স্প্রিংবুট কনফিগারেশন খুঁজে পাওয়া যায়নি


184

আমি ফ্রেমওয়ার্কে নতুন (সবেমাত্র ক্লাস পাস করেছি) এবং স্প্রিং বুটটি ব্যবহার করে এটি আমার প্রথমবার।

আমি আমার ক্রুডেপোজিটারিগুলি সত্যিই কাজ করছে কিনা তা দেখার জন্য আমি একটি সাধারণ জুনিট পরীক্ষা চালানোর চেষ্টা করছি।

আমি যে ত্রুটিটি পেতে থাকি তা হ'ল:

@ স্প্রিংবুট কনফিগারেশন খুঁজে পাওয়া যায়নি, আপনার পরীক্ষা java.lang.IllegalStateException সহ আপনার @ContextConfigration বা @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: @SpringBootConfigration সন্ধান করতে অক্ষম, আপনাকে আপনার পরীক্ষার সাথে @ কনটেক্সট কনফিগারেশন বা @ স্প্রিংবুটটেষ্ট (ক্লাস = ...) ব্যবহার করতে হবে


1
অভিবাদন, টেস্ট এবং অ্যাপ্লিকেশন কোডের জন্য আলাদা প্যাকেজ সহ মাভেন প্যাকেট সেটআপ ব্যবহার করে একটি সমাধান দেওয়ার জন্য আপনাকে ধন্যবাদ। আপনি যদি যা বলছেন তা যদি আমি সঠিকভাবে ব্যাখ্যা করি, তবে আমাকে আমার পরীক্ষার প্যাকেজটি অ্যাপ্লিকেশন শ্রেণিতে পরিচালিত করতে হবে? এবং তারপরে এটি স্প্রিং কনফিগারেশনটি খুঁজে পাবে?
টমাস বিললেট

দ্বারা "ম্যাভেন প্যাকেট" আপনি "মডিউল" বলতে চাচ্ছি, তাহলে হ্যাঁ, মডিউল, যা আপনার পরীক্ষার ক্লাস হয় মডিউল যে উপর নির্ভর করে থাকে Applicationহবে। তাহলে, কিন্তু, আপনি কি বলতে চান src/mainএবং src/testতারপর, ঐ ফোল্ডার প্যাকেজের অংশ নয় অনুক্রমের। স্ক্রিনশট বা আপনার প্রকল্পের কাঠামোটি কেমন তা ব্যাখ্যা দিয়ে আপনার প্রশ্নটি আপডেট করার চেয়ে আপনি সম্ভবত আরও ভাল।
টমাস ক্যাসিন

আপনি যেমন বলেছিলেন ঠিক তেমনই সমস্যার সমাধান করেছি। কিছুটা গুগল করার পরে আমি প্রস্তাবিত বসন্তের প্যাকেট কাঠামোটি পেয়েছি এবং সেগুলি সবগুলি রিফ্যাক্টর করেছি। এখন পরীক্ষাগুলি প্রত্যাশার মতো চলছে। অনেক ধন্যবাদ
থমাস বিলেট

ঠিক আছে, জেনে রাখা ভাল! আমি যাইহোক, আরও পুঙ্খানুপুঙ্খ উদাহরণ সহ উত্তরটি আপডেট করেছি।
টমাস ক্যাসিন

3
+ - পরীক্ষা + - কম + - উদাহরণ + - জেপাটেষ্ট.জভাও কাজ করে
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=...) ...

এটি একটি খুব মূল্যবান উত্তর! ধন্যবাদ @ ক্যামেরন!
ল্যান্স কাইন্ড

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(PostController.class)
public class PostControllerMvcTest{

    @Inject MockMvc mockMvc;

}

@ ডেটাজেপাটেষ্ট একটি এম্বেডড ডাটাবেস প্রস্তুত করবে এবং পরীক্ষার জন্য প্রাথমিক জেপিএ পরিবেশ সরবরাহ করবে।

@ রিস্টক্লিয়েন্টটেষ্ট পরীক্ষার জন্য আরএসএসটি ক্লায়েন্ট পরিবেশ সরবরাহ করে, এনএসপি রেস্টটেম্পলেটবিল্ডার ইত্যাদি provides

এই টীকাগুলি স্প্রিংবুটটেষ্টের সাথে রচিত নয়, এগুলি একটি সিরিজ 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 {}

আপনি ডিফল্ট কনফিগারেশনকে ওভাররাইড করতে আপনার @ অটোকনফিগুরে এক্সএক্সএক্স টিকা যোগ করতে পারেন।

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

আসুন আপনার সমস্যাটি একবার দেখুন,

  1. মিশ্রণ করবেন না @DataJpaTestএবং @SpringBootTestযেমন উপরে বলা হয়েছে @DataJpaTestকনফিগারেশনটিকে নিজস্ব উপায়ে তৈরি করবে (উদাহরণস্বরূপ, এটি ডিফল্টরূপে, পরিবর্তে এটি একটি এম্বেডড H2 প্রস্তুত করার চেষ্টা করবে) অ্যাপ্লিকেশন কনফিগারেশন উত্তরাধিকার থেকে। পরীক্ষার টুকরো@DataJpaTest জন্য মনোনীত করা হয় ।
  2. আপনি যদি কনফিগারেশনটি কাস্টমাইজ করতে চান @DataJpaTestতবে অনুগ্রহ করে এই বিষয়টির জন্য স্প্রিং.আইওর থেকে এই অফিশিয়াল ব্লগ এন্ট্রি পড়ুন , (কিছুটা বিরক্তিকর)।
  3. মধ্যে কনফিগারেশনের বিভক্ত Applicationযেমন বৈশিষ্ট্য মাধ্যমে এটিকে আরো ছোট কনফিগারেশনের, মধ্যে WebConfig, DataJpaConfigইত্যাদি পূর্ণ বৈশিষ্ট্যযুক্ত কনফিগারেশন (মিশ্র ওয়েব, ডেটা, নিরাপত্তা ইত্যাদি) আপনার সৃষ্ট পরীক্ষা ফালি ভিত্তিক পরীক্ষায় ব্যর্থ হতে পারে। পরীক্ষা করে দেখুন পরীক্ষা নমুনা মধ্যে আমার নমুনা

1

আমি মনে করি যে এই সমস্যাটির সর্বোত্তম সমাধান হ'ল অ্যাপ্লিকেশন ফোল্ডারের কাঠামোর সাথে আপনার পরীক্ষার ফোল্ডারগুলির কাঠামোটিকে সারিবদ্ধ করা।

আমার একই সমস্যাটি ছিল যা আমার প্রকল্পটিকে অন্য একটি ফোল্ডার কাঠামো প্রকল্প থেকে নকল করে caused

যদি আপনার পরীক্ষার প্রকল্প এবং আপনার অ্যাপ্লিকেশন প্রকল্পের কাঠামোগত একই কাঠামো থাকে তবে আপনাকে আপনার পরীক্ষার ক্লাসগুলিতে কোনও বিশেষ টিকা যুক্ত করার প্রয়োজন হবে না এবং সবকিছু যেমন রয়েছে তেমন কার্যকর হবে।


আমারও একই ত্রুটি ছিল এবং শেষ পর্যন্ত আমি বুঝতে পারি যে পরীক্ষার শ্রেণীর প্যাকেজের নামটিতে "বিধি" এর জায়গায় টাইপো "রুল" ছিল। প্যাকেজের নাম ঠিক করার পরে, ত্রুটি চলে গেছে।
গোপাল বৈয়ারওয়া

1

যখন সমস্ত ক্লাস একই প্যাকেজে ছিল, পরীক্ষার ক্লাসগুলি কাজ করছিল। যথাযথ প্রকল্পের কাঠামো বজায় রাখতে আমি সমস্ত জাভা ক্লাসগুলি বিভিন্ন প্যাকেজে সরিয়ে নিয়ে যাওয়ার সাথে সাথে আমি একই ত্রুটি পেয়েছি।

আমি নীচের মত পরীক্ষার ক্লাসে আমার মূল শ্রেণীর নাম সরবরাহ করে এটি সমাধান করেছি।

@SpringBootTest(classes=JunitBasicsApplication.class)

1

আমার একই সমস্যা ছিল এবং আমি SpringBootApplicationফোল্ডারের এসআরসি / টেস্ট / জাভা ফোল্ডারের মূল প্যাকেজে টিকিটে খালি ক্লাস যুক্ত করে সমাধান করেছি

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

উপরে টীকাগুলি আমার পক্ষে ভাল কাজ করেছে। আমি জেপিএ সহ স্প্রিং বুট ব্যবহার করছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.