জুনিট টেস্টে ডিফল্ট স্প্রিং-বুট অ্যাপ্লিকেশন p প্রপার্টি সেটিংস ওভাররাইড করুন


198

আমার কাছে একটি স্প্রিং-বুট অ্যাপ্লিকেশন রয়েছে যেখানে application.propertiesক্লাসপথের একটি ফাইলে ডিফল্ট বৈশিষ্ট্য সেট করা হয় (src / প্রধান / সংস্থান / অ্যাপ্লিকেশন। প্রপার্টি )।

আমি আমার JUnit পরীক্ষায় কিছু test.propertiesফাইল ডিফল্ট (src / টেস্ট / রিসোর্স / টেস্ট.প্রোপার্টি) ঘোষিত সম্পত্তি সহ কিছু ডিফল্ট সেটিংস ওভাররাইড করতে চাই

আমার নিয়মিত আমার জুনিট টেস্টগুলির জন্য একটি ডেডিকেটেড কনফিগার ক্লাস থাকে

package foo.bar.test;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

}

আমি প্রথম যে চিন্তা ব্যবহার @PropertySource("classpath:test.properties")TestConfig ক্লাসে কৌতুক করতে পারে, কিন্তু এই বৈশিষ্ট্য application.properties সেটিংস ওভাররাইট করা হবে না (দেখুন বসন্ত-বুট রেফারেন্স ডক - 23 বাহ্যিক কনফিগারেশন )।

তারপরে -Dspring.config.location=classpath:test.propertiesপরীক্ষার ডাক দেওয়ার সময় আমি ব্যবহার করার চেষ্টা করেছি । এটি সফল ছিল - তবে আমি প্রতিটি পরীক্ষার প্রয়োগের জন্য এই সিস্টেমের সম্পত্তিটি সেট করতে চাই না। এইভাবে আমি কোড এ রেখেছি

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

  static {
    System.setProperty("spring.config.location", "classpath:test.properties");
  }

}

যা দুর্ভাগ্যক্রমে আবার সফল হয়নি।

application.propertiesJUnit পরীক্ষাগুলিতে সেটিংস কীভাবে ওভাররাইড করা যায় তার একটি সহজ সমাধান test.propertiesঅবশ্যই আমাকে অবশ্যই উপেক্ষা করতে হবে।


আপনার যদি মাত্র কয়েকটি বৈশিষ্ট্য কনফিগার করতে হয় তবে আপনি নতুন @ ডাইনামিকপ্রোপার্টিসোর্স টিকাটি ব্যবহার করতে পারেন। stackoverflow.com/a/60941845/8650621
ফিলিপ দেশীদারিটি

উত্তর:


293

আপনি @TestPropertySourceমানগুলিকে ওভাররাইড করতে ব্যবহার করতে পারেন application.properties। এর জাভাডোক থেকে:

পরীক্ষা সম্পত্তি উত্সগুলি সিস্টেম এবং অ্যাপ্লিকেশন সম্পত্তি উত্সগুলিতে সংজ্ঞায়িত বৈশিষ্ট্যগুলি নির্বাচিতভাবে ওভাররাইড করতে ব্যবহৃত হতে পারে

উদাহরণ স্বরূপ:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}

2
এটাই. ধন্যবাদ। দুর্ভাগ্যক্রমে উদাহরণ অ্যাপ্লিকেশন.ক্লাস ব্যবহার করার সময় এটি কাজ করে না তাই আমাকে এটি প্রতিটি পরীক্ষার ক্লাসে সেট করতে হবে। এটা কি সঠিক?
FrVaBe

1
এটি পরীক্ষার শ্রেণীর শ্রেণিবিন্যাসের কোথাও যেতে হবে, অর্থাত আপনি একটি প্রচলিত সুপারক্লাসটি বিভিন্ন পরীক্ষার ক্লাস জুড়ে কনফিগার করতে ব্যবহার করতে পারেন।
অ্যান্ডি উইলকিনসন

64
এছাড়াও নোট করুন যে কিছু সম্পত্তি ইনলাইন ওভাররাইট করার @TestPropertySourceজন্য একটি propertiesযুক্তি গ্রহণ করতে পারে, যেমন @TestPropertySource(properties = "myConf.myProp=valueInTest"), আপনি সম্পূর্ণ ব্র্যান্ডের নতুন সম্পত্তি ফাইল না চান সে ক্ষেত্রে এটি কার্যকর।
ডায়েং

2
আপনি অ্যারেতে একাধিক ফাইল এবং ফাইল সিস্টেমেও ফাইল নির্দিষ্ট করতে পারেন (তবে মনে রাখবেন তারা সিআই সার্ভারে কাজ নাও করতে পারে):@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
অ্যাডাম

8
দ্রষ্টব্য, এটি @SpringApplicationConfigurationইতিমধ্যে @SpringBootTest
অবমুক্ত করা

74

স্প্রিং বুট স্বয়ংক্রিয়ভাবে লোড হয় src/test/resources/application.properties, যদি নিম্নলিখিত টীকাগুলি ব্যবহৃত হয়

@RunWith(SpringRunner.class)
@SpringBootTest

সুতরাং, নামান্তর test.propertiesকরতে application.propertiesস্বয়ংক্রিয় কনফিগারেশন ব্যবহার করতে।

আপনার যদি কেবল * সম্পত্তি বৈশিষ্ট্যের ফাইলটি (পরিবেশে) লোড করতে হয় তবে আপনি এখানে বর্ণিত হিসাবে নিম্নলিখিতগুলিও ব্যবহার করতে পারেন

@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[ আপডেট: পরীক্ষার জন্য কিছু বৈশিষ্ট্য ওভাররাইড করা ]

  1. অ্যাড src/main/resources/application-test.properties
  2. সাথে পরীক্ষার ক্লাস টিকিয়ে দিন @ActiveProfiles("test")

এখানে সংজ্ঞায়িত বিধি অনুসারে পরীক্ষার ক্ষেত্রে প্রয়োগের প্রসঙ্গে এই লোডগুলি application.propertiesএবং তার পরে application-test.properties বৈশিষ্ট্যগুলি ।

ডেমো - https://github.com/mohnish82/so-spring-boot-testprop


1
application.propertiesক্লাসপথে দুটি ফাইল রাখার পক্ষে একটি ভাল ধারণা কিনা তা নিশ্চিত নয় (একটিতে src/main/resourcesএবং একটিতে src/test/resources)। দু'জনকে নেওয়া হবে এবং কোনটি আগে নেওয়া হবে তার নিশ্চয়তা কে?
ফ্রাভাবে

3
@ ফ্রাভাবে স্প্রিং এর গ্যারান্টি দিতে চলেছে! প্রধান প্রোফাইল বৈশিষ্ট্য সর্বদা লোড হয়। তারপরে পরীক্ষার পর্যায়ে, পরীক্ষার বৈশিষ্ট্যগুলি লোড করা হয়, নতুন / বিদ্যমান বৈশিষ্ট্য যুক্ত / ওভাররাইড করে। আপনি একই নামের দুটি ফাইল রাখার মত না থাকে, তাহলে আপনি যোগ করতে পারেন application-test.propertiesমধ্যে src/main/resourcesএবং নির্দিষ্ট testপরীক্ষা ক্ষেত্রে সক্রিয় প্রোফাইলের হিসাবে।
মোহনিশ

7
বসন্ত কোনও গ্যারান্টি দেয় না। বিল্ড সরঞ্জাম পরীক্ষার সময় প্রধান সংস্থানগুলির পক্ষে পরীক্ষার সংস্থানগুলি ব্যবহার করবে। তবে কোনও পরীক্ষার ক্ষেত্রে অ্যাপ্লিকেশন rop প্রপার্টিগুলি মূল অ্যাপ্লিকেশন p প্রপার্টি উপেক্ষা করা হবে। এটি আমি চাই না কারণ মূলটিতে বেশ কয়েকটি দরকারী ডিফল্ট মান রয়েছে এবং পরীক্ষার সময় আমার কেবল কয়েকটিটি ওভাররাইড করা প্রয়োজন (এবং আমি পরীক্ষার বিভাগে পুরো ফাইলটি নকল করতে চাই না)। এখানে দেখুন ।
ফ্রিভাবে

6
আপনি সঠিক, src/test/resources/application.propertiesপরীক্ষার পর্যায়ে শুধুমাত্র সংজ্ঞায়িত বৈশিষ্ট্যগুলি লোড করা হয়, src/main/resources/application.propertiesএড়ানো হবে।
মোহনিশ

11
আপনি যদি এখনও পর্যন্ত প্রোফাইল ব্যবহার না করেন তবে আপনাকে ডেডিকেটেড "টেস্ট" প্রোফাইলের প্রয়োজন হবে না। কেবলমাত্র আপনার পরীক্ষার বৈশিষ্ট্যগুলির নাম দিন application-default.propertiesএবং সেগুলি বিবেচনা করা হবে কারণ আপনি স্বয়ংক্রিয়ভাবে "ডিফল্ট" প্রোফাইল চালাচ্ছেন (অন্য কোনও হিসাবে ঘোষণা না করা থাকলে)।
ফ্রিভাবে

65

আপনি কনফিগারেশন বহিরাগত করতে মেটা-টিকা ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

@RunWith(SpringJUnit4ClassRunner.class)
@DefaultTestAnnotations
public class ExampleApplicationTests { 
   ...
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public @interface DefaultTestAnnotations { }

21

আপনার পরীক্ষার কয়েকটি বৈশিষ্ট্য ওভাররাইড করার জন্য উপযুক্ত আরেকটি পদ্ধতি, যদি আপনি @SpringBootTestটিকা ব্যবহার করেন :

@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})

1
নেই SpringBootTestapplication.properties ফাইল লোড?
টুগোর্ডোবেলো

8

TLDR:

সুতরাং আমি যা করেছি তা হ'ল মানক src/main/resources/application.propertiesএবং এমন একটি জায়গা src/test/resources/application-default.propertiesযেখানে আমি আমার সমস্ত পরীক্ষার জন্য কিছু সেটিংস ওভাররাইড করে।

পুরো বিবরণ

আমি একই সমস্যায় পড়েছি এবং এখন পর্যন্ত প্রোফাইলগুলি ব্যবহার করছিলাম না। মনে হচ্ছে এটি এখনই করতে হবে এবং প্রোফাইলটি ঘোষণার কথা মনে রাখবেন - যা সহজেই ভুলে যেতে পারে।

কৌশলটি হ'ল, কোনও প্রোফাইল নির্দিষ্ট application-<profile>.propertiesপ্রোফাইলের সাধারণ প্রোফাইলটিতে সেটিংসকে ওভাররাইড করে verage Https://docs.spring.io/spring-boot/docs/current/references/html/boot-features-ternternal-config.html#boot-features-ternternal-config-profile-specific-properties দেখুন ।


3

সহজ ব্যাখ্যা:

আপনি যদি আমার মতো হন এবং আপনার মধ্যে একই application.propertiesথাকে src/main/resourcesএবং src/test/resourcesআপনি কেন ভাবছেন যে application.propertiesআপনার পরীক্ষার ফোল্ডারে থাকা কেন আপনার প্রধান সংস্থানগুলিতে ওভাররাইড করছে application.propertiesনা, তা পড়ুন ...

যদি আপনার application.propertiesঅধীনে থাকে src/main/resourcesএবং এটির application.propertiesঅধীনে থাকে src/test/resourcesযা application.propertiesবাছাই হয়ে যায়, আপনি কীভাবে আপনার পরীক্ষা চালাচ্ছেন তার উপর নির্ভর করে । ফোল্ডারের গঠন src/main/resources এবং src/test/resourcesতোমার মতোই আপনার পরীক্ষা চালানো তাই যদি একটি ম্যাভেন স্থাপত্য কনভেনশন, mvnw testবা এমনকি gradlew test, application.propertiessrc/test/resourcesকুড়ান হবে, যেমন পরীক্ষা ক্লাসপাথ নিকট আসবে প্রধান ক্লাসপাথ। কিন্তু, আপনাকে মত আপনার পরীক্ষা চালানো যদি Run as JUnit TestElipse / এসটিএস এ, application.propertiesমধ্যে src/main/resourcesকুড়ান হবে, যেমন প্রধান ক্লাসপাথ আগে বসেছে পরীক্ষা ক্লাসপাথ।

এটি খোলার মাধ্যমে এটি পরীক্ষা করে দেখতে পারেন Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"

আপনি এরকম কিছু দেখতে পাবেন:

XXXbin \ jawaw.exe -ea -Dfile.encoding = UTF-8-Classpath XXX \ ওয়ার্কস্পেস-স্প্রিং-টুল-স্যুট -4-4.5.1. রিলিজি \ প্রকল্পের নাম \ বিন \ মূল; XXX এর \ কর্মক্ষেত্র-বসন্ত-টুল-স্যুট-4-4.5.1.RELEASE \ PROJECT_NAME \ বিন \ পরীক্ষা;

আপনি কি দেখেন যে \ প্রধানটি প্রথমে আসে, এবং তারপরে \ পরীক্ষা ? ঠিক আছে, এটি ক্লাসপাথ সম্পর্কে :-)

চিয়ার্স


1
I just configured min as the following :

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console


# changing the name of my data base for testing
spring.datasource.url= jdbc:h2:mem:mockedDB
spring.datasource.username=sa
spring.datasource.password=sa



# in testing i don`t need to know the port

#Feature that determines what happens when no accessors are found for a type
#(and there are no annotations to indicate it is meant to be serialized).
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false`enter code here`

1

যদি আপনি স্প্রিং 5.2.5 এবং স্প্রিং বুট ২.২.। ব্যবহার করছেন এবং পুরো ফাইলটির পরিবর্তে কয়েকটি বৈশিষ্ট্য ওভাররাইড করতে চান। আপনি নতুন টিকাটি ব্যবহার করতে পারেন: @ ডাইনামিকপ্রোপার্টিসোর্স

@SpringBootTest
@Testcontainers
class ExampleIntegrationTests {

    @Container
    static Neo4jContainer<?> neo4j = new Neo4jContainer<>();

    @DynamicPropertySource
    static void neo4jProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.data.neo4j.uri", neo4j::getBoltUrl);
    }
}

0

অন্যথায় আমরা ডিফল্ট সম্পত্তি কনফিগারারের নাম পরিবর্তন করতে পারি, সম্পত্তি নির্ধারণ করে spring.config.name=testএবং তারপরে শ্রেণিক -পথের সংস্থান থাকা src/test/test.propertiesআমাদের নেটিভ উদাহরণটি org.springframework.boot.SpringApplicationপৃথক পৃথক পরীক্ষার থেকে স্বয়ংক্রিয়ভাবে কনফিগার করা হবে rop

উপকার: পরীক্ষার স্বয়ংক্রিয় কনফিগারেশন;

খসড়া: "স্প্রিং.কনফিগ.নাম" বৈশিষ্ট্যটি সিআই স্তরে প্রকাশ করা

সুত্র: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

বসন্তের কনফিগ.নাম = অ্যাপ্লিকেশন # কনফিগার ফাইলের নাম


5
উপেক্ষা application.propertiesকরা আমার পক্ষে কোনও বিকল্প নয় কারণ আমি পরীক্ষার মধ্যে কয়েকটি মূল কনফিগারেশন মানকে ওভাররাইড করতে চাই ।
FrVaBe

আমি একটি একক পরীক্ষা করার উপায় খুঁজছি যা এসসিআর / প্রধান / সংস্থানগুলি / অ্যাপ্লিকেশন.প্রপ্রেটিগুলি লোড করে না এবং এটি এটি। একটি ফাইল তৈরি করুন: এসসিআর / টেস্ট / রিসোর্স / খালি.প্রাপ্তি এবং পরীক্ষাগুলিতে টীকাগুলি যুক্ত করুন যা প্রধান বৈশিষ্ট্যগুলি উপেক্ষা করবে। @ টেস্টপ্রোপার্টিসোর্স (বৈশিষ্ট্যগুলি "" বসন্তকনফিগ.নাম = খালি ")
রাভারটিগো

প্রতিটি জুনিট পরীক্ষা পদ্ধতির জন্য একটি নির্দিষ্ট সম্পত্তি মান কীভাবে সেট করবেন?
নিকোলাস

0

আপনি এসআরসি / পরীক্ষা / সংস্থানগুলিতে একটি অ্যাপ্লিকেশন.প্রপার্টি ফাইল তৈরি করতে পারেন যেখানে আপনার JUnits লেখা আছে।


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