दिलचस्प पोस्ट
जावा: एसएसएल हैंडशेक क्यों 'डीएच कीपैयर उत्पन्न नहीं कर सकता' अपवाद दे रहा है? jQuery: माउसमोव ईवेंट के दौरान दबाए हुए माउस बटन का पता लगा रहा है कैसे एक आइटम अपनी संभावना से चुनने के लिए? क्यों खड़े ** चारों ओर का निर्माण ** एक चेतावनी उत्पन्न क्यों करता है? कश्मीर के बराबर क्लस्टर आकार के साथ एल्गोरिथ्म भिन्नता का मतलब है दो स्टैक का प्रयोग करके कतार कैसे कार्यान्वित करें? सरणी में एकमात्र अनपेक्षित तत्व ढूंढें जावा फ़ाइल – एक फ़ाइल खोलें और इसे लिखें ब्राउज़र प्रिंट इवेंट का पता लगा रहा है जेसन। नेट (न्यूटन्सफ्ट। जेसन) – दो नाम 'समान' नाम हैं? क्या हम जावा में मुख्य विधि अधिभार कर सकते हैं? घोंसले के शिकार <div> होगा जब नेस्टिंग <p> काम नहीं करेगा? जावास्क्रिप्ट में किसी विशेष सूचकांक में मैं एक कैरेक्टर को कैसे बदलूं? मौजूदा उपयोगकर्ता कैसे प्राप्त करें और MVC5 में उपयोगकर्ता वर्ग का उपयोग कैसे करें? ऑर्थोग्राफिक कैमरा और रेकास्ट के साथ ऑब्जेक्ट्स का चयन

मैवेन में परीक्षण के लिए जेपीए को कॉन्फ़िगर कैसे करें

क्या मैवेन प्रोजेक्ट में दूसरी दृढ़ता। एक्सएमएल फ़ाइल को सेट करने का एक तरीका है, जिसका इस्तेमाल उस परिनियोजन के लिए उपयोग किए जाने वाले सामान्य के बजाय परीक्षण के लिए किया जाता है?

मैंने src / test / resources / META-INF में एक persistence.xml डालने की कोशिश की, जो लक्ष्य / टेस्ट-क्लास / एमईटीए-आईएनएफ में कॉपी की जाती है, लेकिन यह लक्ष्य / वर्ग / मेटा-आईएनएफ (src / main से प्रतिलिपि / संसाधन) mvn -X test बावजूद वरीयता प्राप्त करता है, सही क्रम में क्लासपाथ प्रविष्टियों को सूचीबद्ध करता है:

 [DEBUG] Test Classpath : [DEBUG] /home/uqpbecke/dev/NetBeansProjects/UserManager/target/test-classes [DEBUG] /home/uqpbecke/dev/NetBeansProjects/UserManager/target/classes [DEBUG] /home/uqpbecke/.m2/repository/junit/junit/4.5/junit-4.5.jar ... 

मैं जेपीए कॉन्फ़िगरेशन के परिनियोजन संस्करण को बदलने के बिना एक साधारण एचएसक्यूएलडीबी विन्यास के खिलाफ परीक्षण चलाने में सक्षम होना चाहता हूं, आदर्श रूप से सीधे स्थानीय चेकिंग के बिना परियोजना चेकआउट के बाद।

Solutions Collecting From Web of "मैवेन में परीक्षण के लिए जेपीए को कॉन्फ़िगर कैसे करें"

निम्नलिखित मैवेन 2.1+ के लिए काम करेगा (इससे पहले कि परीक्षण और पैकेज के बीच कोई चरण नहीं था, जिसे आप निष्पादन को बाध्य कर सकते हैं)।

आप परीक्षण की अवधि के लिए परीक्षण संस्करण के साथ persistence.xml को बदलने के लिए maven-antrun-plugin का उपयोग कर सकते हैं, फिर प्रोजेक्ट को पैक किए जाने से पहले उचित संस्करण को पुनर्स्थापित कर सकते हैं।

यह उदाहरण मानता है कि उत्पादन संस्करण src / main / resources / META-INF / persistence.xml है और परीक्षण संस्करण src / test / resources / META-INF / persistence.xml है, इसलिए उन्हें लक्ष्य / वर्गों / एमईटीए में कॉपी किया जाएगा -INF और लक्ष्य / टेस्ट क्लास / एमईटीए-एनईएफ क्रमशः।

यह एक मोहोज़ा में इसे आवृत करने के लिए और अधिक सुरुचिपूर्ण होगा, लेकिन जैसा कि आप केवल एक फ़ाइल कॉपी करते हैं, ऐसा लगता है कि ओव्हरकिल

 <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> <executions> <execution> <id>copy-test-persistence</id> <phase>process-test-resources</phase> <configuration> <tasks> <!--backup the "proper" persistence.xml--> <copy file="${project.build.outputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml.proper"/> <!--replace the "proper" persistence.xml with the "test" version--> <copy file="${project.build.testOutputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> <execution> <id>restore-persistence</id> <phase>prepare-package</phase> <configuration> <tasks> <!--restore the "proper" persistence.xml--> <copy file="${project.build.outputDirectory}/META-INF/persistence.xml.proper" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> 

ईई 6 / सीडीआई / जेपीए प्रोजेक्ट में, एक परीक्षण src/test/resources/META-INF/persistence.xml । एक्सएमएल को बिना किसी और विन्यास के ठीक से उठाया गया है।

वसंत में जेपीए का उपयोग करते समय, परीक्षण के लिए उपयोग किए गए अनुप्रयोग संदर्भ में निम्नलिखित कार्य:

 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- JPA requires META-INF/persistence.xml, but somehow prefers the one in classes/META-INF over the one in test-classes/META-INF. Spring to the rescue, as it allows for setting things differently, like by referring to "classpath:persistence-TEST.xml". Or, simply referring to "META-INF/persistence.xml" makes JPA use the test version too: --> <property name="persistenceXmlLocation" value="META-INF/persistence.xml" /> <!-- As defined in /src/test/resources/META-INF/persistence.xml --> <property name="persistenceUnitName" value="myTestPersistenceUnit" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> </bean> </property> </bean> 

यहां, /src/test/resources/META-INF/persistence.xml ( target/test-classes में कॉपी किया गया) /src/main/resources/META-INF/persistence.xml ( target/classes में कॉपी किया गया) से अधिक पसंद किया जाएगा। ।

दुर्भाग्य से, persistence.xml@Entity फ़ाइल का स्थान तथाकथित " हठ इकाई के जड़ " को भी निर्धारित करता है, जो फिर निर्धारित करता है कि कौन-सी कक्षाएं @Entity एनोटेशन के लिए स्कैन की जाती हैं इसलिए, /src/test/resources/META-INF/persistence.xml का उपयोग target/test-classes कक्षाओं में वर्गों को स्कैन करेगा, न कि target/classes (जहां कक्षाएं जिन्हें परीक्षण करने की आवश्यकता होती है वे रहते हैं)।

इसलिए, परीक्षण के लिए, एक को स्पष्ट रूप से <class> प्रविष्टियों को persistence.xml जोड़ने की आवश्यकता होगी, से बचने के लिए java.lang.IllegalArgumentException: Not an entity: class ... <class> प्रविष्टियों की आवश्यकता को एक अलग फ़ाइल नाम का प्रयोग करके बचा जा सकता है, जैसे कि persistence-TEST.xml , और उस फ़ाइल को एक ही फ़ोल्डर में नियमित रूप से persistence.xml फ़ाइल के रूप में डाल दिया। आपके परीक्षण फ़ोल्डर से वसंत का संदर्भ तब केवल <property name="persistenceXmlLocation" value="META-INF/persistence-TEST.xml" /> , और स्प्रिंग आपके लिए यह src/main में मिल जाएगा।

एक विकल्प के रूप में, किसी भी वास्तविक अनुप्रयोग और परीक्षणों के लिए persistence.xml को बनाए रखने में सक्षम हो सकता है। और केवल src/main में एक को परिभाषित कर सकते हैं। ड्राइवरों, बोलियों और वैकल्पिक क्रेडेंशियल्स जैसे अधिकांश कॉन्फ़िगरेशन को इसके बजाय स्प्रिंग संदर्भ में किया जा सकता है। साथ ही hibernate.hbm2ddl.auto जैसे सेटिंग्स को संदर्भ में पारित किया जा सकता है :

 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- For example: com.mysql.jdbc.Driver or org.h2.Driver --> <property name="driverClassName" value="#{myConfig['db.driver']}" /> <!-- For example: jdbc:mysql://localhost:3306/myDbName or jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 --> <property name="url" value="#{myConfig['db.url']}" /> <!-- Ignored for H2 --> <property name="username" value="#{myConfig['db.username']}" /> <property name="password" value="#{myConfig['db.password']}" /> </bean> <bean id="jpaAdaptor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- For example: org.hibernate.dialect.MySQL5Dialect or org.hibernate.dialect.H2Dialect --> <property name="databasePlatform" value="#{myConfig['db.dialect']}" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter" ref="jpaAdapter" /> <property name="jpaProperties"> <props> <!-- For example: validate, update, create or create-drop --> <prop key="hibernate.hbm2ddl.auto">#{myConfig['db.ddl']}</prop> <prop key="hibernate.show_sql">#{myConfig['db.showSql']}</prop> <prop key="hibernate.format_sql">true</prop> </props> </property> </bean> 

ऐसा लगता है कि कई persistence.xml फ़ाइलें JPA के साथ एक सामान्य समस्या है, केवल क्लासलोडिंग चाल से हल।

एक समाधान जो मेरे लिए काम करता है, एक दृढ़ता। एक्सएमएल फ़ाइल में कई दृढ़ता इकाइयों को परिभाषित करना है और फिर सुनिश्चित करें कि आपकी परिनियोजन और परीक्षण कोड एक अलग बंधन का उपयोग करें (वसंत में आप इकाई प्रबंधक कारखाने पर "persistenceUnitName" संपत्ति सेट कर सकते हैं)। यह आपके परिनियोजन फ़ाइल को टेस्ट कॉन्फ़िगरेशन के साथ प्रदूषित करता है, लेकिन अगर आपको यह ध्यान नहीं है कि यह ठीक से काम करता है

मैंने क्लास लोडर प्रोक्सी दृष्टिकोण की कोशिश की, लेकिन समस्या यह थी कि जेपीए एनोटेट किया गया वर्गों को सीतनिद्रा में होना लगातार वर्गों के रूप में नहीं संभाला जाता है

तो दृढ़ता का उपयोग किए बिना कोशिश करने का फैसला किया। Xml लाभ यह है कि मेवेन बिल्ड और एक्लिप्स ज्युनिट टेस्ट बिना किसी संशोधन के काम करेगा।

JUnit परीक्षण के लिए मेरे पास एक दृढ़ समर्थन वर्ग है

 public class PersistenceTestSupport { protected EntityManager em; protected EntityTransaction et; /** * Setup the the {@code EntityManager} and {@code EntityTransaction} for * local junit testing. */ public void setup() { Properties props = new Properties(); props.put("hibernate.hbm2ddl.auto", "create-drop"); props.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); props.put("hibernate.connection.url", "jdbc:mysql://localhost/db_name"); props.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); props.put("hibernate.connection.username", "user"); props.put("hibernate.connection.password", "****"); Ejb3Configuration cfg = new Ejb3Configuration(); em = cfg.addProperties(props) .addAnnotatedClass(Class1.class) .addAnnotatedClass(Class2.class) ... .addAnnotatedClass(Classn.class) .buildEntityManagerFactory() .createEntityManager(); et = em.getTransaction(); } } 

मेरी परीक्षा कक्षाएं बस PersistenceTestSupport का विस्तार करती हैं और TestCase.setup () में सेटअप () को कॉल करती हैं।

एकमात्र दोष यह है कि निरंतर कक्षाएं अप करने के लिए जारी रखें, लेकिन JUnit परीक्षण के लिए यह मेरे लिए स्वीकार्य है

परीक्षणों के लिए एक persistance.xml जोड़ें: /src/test/resources/META-INF/persistence.xml जैसा @ अरजान ने कहा, जो दृढ़ता इकाई की जड़ को बदल देगा और इकाई वर्ग लक्ष्य / परीक्षण-वर्गों में स्कैन किए जाएंगे। इसे संभालने के लिए, जर्-फाइल तत्व को इस persistance.xml में जोड़ें:

/src/test/resources/META-INF/persistence.xml

 <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="com.some.project"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <jar-file>${project.basedir}/target/classes</jar-file> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test_database" /> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <property name="javax.persistence.jdbc.user" value="user" /> <property name="javax.persistence.jdbc.password" value="..." /> </properties> </persistence-unit> </persistence> 

उसके बाद, अपने pom.xml में परीक्षण संसाधनों का फ़िल्टरिंग जोड़ें:

 <project> ... <build> ... <testResources> <testResource> <directory>src/test/resources</directory> <filtering>true</filtering> </testResource> </testResources> ... </build> ... </project> 

यह काम करेगा क्योंकि जार-फाइल निर्देशिकाओं को लक्षित कर सकती है, न केवल जार फ़ाइलों के लिए।

मैं परीक्षण और उत्पादन के लिए रिच विक्रेता पोस्ट (धन्यवाद !!) के लिए अलग-अलग persistence.xml का उपयोग करने का समाधान पसंद करता हूं।

लेकिन बदलने की आवश्यकता है:

 <copy file="${project.build.outputDirectory}/META-INF/persistence.xml.proper" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/> 

के लिये:

 <move file="${project.build.outputDirectory}/META-INF/persistence.xml.proper" tofile="${project.build.outputDirectory}/META-INF/persistence.xml" overwrite="true"/> 

आदेश persistence.xml.proper में एम्बेडेड नहीं है .jar फ़ाइल

यह जवाब मूर्खतापूर्ण लग सकता है, लेकिन मैं एक ऐसे रास्ते की तलाश कर रहा था जो मुझे उन परीक्षणों को Run As में चलाता है -> JUnit Test । इस प्रकार मैंने इसे बनाया है:

 @BeforeClass public static void setUp() throws IOException { Files.copy(new File("target/test-classes/META-INF/persistence.xml"), new File("target/classes/META-INF/persistence.xml")); // ... } 

मैं सिर्फ परीक्षण / दृढ़ता को XML / classes / persistence.xml में कॉपी कर रहा हूँ यह काम।

दृढ़ता के दो प्रतियां रखें। Xml फ़ाइल परीक्षण के लिए एक और सामान्य बिल्ड के लिए दूसरा

डिफ़ॉल्ट जीवन चक्र, src / test / resources / META-INF के लिए build persistence.xml की प्रतिलिपि बनाएँ

एक अलग प्रोफ़ाइल बनाएं, जो चालू होकर परीक्षण निरंतरता की प्रतिलिपि बनाए जाएंगे। Xml को src / test / resources / META-INF

जब तक आप सभी वर्गों को स्पष्ट रूप से सूचीबद्ध नहीं करते हैं और जोड़ते हैं, तो Persistence.xml को इकाई वर्गों के लिए खोज करने के लिए प्रारंभिक बिंदु के रूप में उपयोग किया जाता है। इसलिए यदि आप इस फ़ाइल को किसी अन्य के साथ ओवरराइड करना चाहते हैं, तो src / test / resources से कहें, आपको इस दूसरी दृढ़ता में प्रत्येक एक इकाई वर्ग को निर्दिष्ट करना होगा अन्यथा कोई एंटिटी क्लास नहीं मिलेगा।

एक अन्य समाधान को Maven-resources-plugin ('copy-resources' लक्ष्य) का उपयोग कर फाइल को अधिलेखित करना होगा। लेकिन फिर आपको इसे दो बार दोहराएं, परीक्षण के लिए एक बार (जैसे चरण प्रक्रिया-परीक्षण-वर्ग) और एक बार असली पैकेजिंग (चरण 'तैयार-पैकेज') के लिए।

मैं एक ही बात करने की कोशिश कर रहा हूँ मेरे पास एक समाधान है जो मेरे लिए काम करता है – तुम्हारा भिन्न हो सकता है (और आप समाधान से प्यार नहीं कर सकते हैं … यह थोड़ा कम स्तर है)।

मैं नेट पर एक आलेख में आया था जहां वे एक कस्टम वर्ग लोडर का प्रयोग कर रहे थे, जो कुछ ऐसी ही थी जो प्रेरणा के रूप में सेवा की थी। अगर कोई देख सकता है कि बेहतर कैसे सुधार किया जाए तो सुझाव बीटीडब्ल्यू का स्वागत करेंगे तैनाती के लिए मैं EntityManager के कंटेनर इंजेक्शन पर भरोसा करता हूं, लेकिन परीक्षण के लिए मैं इस कोड का उपयोग करके इसे स्वयं बना देता हूं:

 final Thread currentThread = Thread.currentThread(); final ClassLoader saveClassLoader = currentThread.getContextClassLoader(); currentThread.setContextClassLoader(new ClassLoaderProxy(saveClassLoader)); EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("test"); em = emFactory.createEntityManager(); 

फिर क्लासलोडर प्रोक्सी के बारे में उतना ही कम है जितना कि आप प्राप्त कर सकते हैं और सिर्फ मेटा-आईएनएफ / दृढ़ता। एक्सएम को मेटा-आईएनएफ / टेस्ट -स्टीस्ट। एक्सएमएल के लिए अनुरोधों को पुनर्निर्देशित कर सकते हैं:

 public class ClassLoaderProxy extends ClassLoader { public ClassLoaderProxy(final ClassLoader parent) { super(); } @Override public Enumeration<URL> getResources(final String name) throws IOException { if (!"META-INF/persistence.xml".equals(name)) { return super.getResources(name); } else { System.out.println("Redirecting persistence.xml to test-persist.xml"); return super.getResources("META-INF/test-persist.xml"); } } } 

बस इसे थोड़ा और समझाने के लिए:

  1. दो persistence.xml फ़ाइलों (एक नाम persistence.xml है जो कि परीक्षण के बाहर प्रयोग किया जाता है और एक नामित test-persist.xml जिसे परीक्षणों के लिए उपयोग किया जाता है)।
  2. कस्टम वर्ग लोडर केवल यूनिट परीक्षणों के लिए सक्रिय है (तैनाती के लिए सब कुछ सामान्य है)
  3. कस्टम वर्ग लोडर "META-INF / persistence.xml" के लिए परीक्षण संस्करण ("मेटा-आईएनएफ़ / टेस्ट-पर्स्ट। एक्सएमएल") के लिए अनुरोधों को रीडायरेक्ट करता है।

मैं मूल रूप से कुछ समस्याओं को मार रहा था क्योंकि सीतनिद्रा में होना हाईबरनेट लोड करने के लिए इस्तेमाल किया गया था कि classloader के लिए वापस (किसी न किसी तरह) वापस जाएगा (कम से कम मुझे लगता है कि क्या हो रहा था)। मैंने पाया है कि क्लासलोडर स्विचिंग कोड (पहला ब्लॉक) को अपने परीक्षण के मामले में एक स्थिर ब्लॉक के रूप में डालने से यह हाइबरनेट के पहले लोड हो जाएगा, लेकिन यह कि, आपकी इकाई परीक्षण संरचना के आधार पर आपको अन्य स्थानों पर एक ही कोड डालनी पड़ सकता है (छी)।

एक अन्य दृष्टिकोण परीक्षण के लिए एक अलग persistence.xml का उपयोग करना है (परीक्षण /../ एमईटीए-आईएनएफ / दृढ़ता। एक्सएमएल लेकिन स्कैनर को ओवरराइड निम्नानुसार है: –

परीक्षण persistence.xml को शामिल करना आवश्यक है

<property name="hibernate.ejb.resource_scanner" value = "...TestScanner" />

नए वर्ग के लिए कोड TestScanner निम्नानुसार है

 import java.lang.annotation.Annotation; import java.net.MalformedURLException; import java.net.URL; import java.util.Set; import org.hibernate.ejb.packaging.NamedInputStream; import org.hibernate.ejb.packaging.NativeScanner; public class TestScanner extends NativeScanner { @Override public Set <Class <?> > getClassesInJar (URL jar, Set <Class <? extends Annotation> > annotations) { return super.getClassesInJar (getUpdatedURL (jar), annotations); } @Override public Set <NamedInputStream> getFilesInJar (URL jar, Set <String> patterns) { return super.getFilesInJar (getUpdatedURL (jar), patterns); } @Override public Set <Package> getPackagesInJar (URL jar, Set <Class <? extends Annotation> > annotations) { return super.getPackagesInJar (getUpdatedURL (jar), annotations); } private URL getUpdatedURL (URL url) { String oldURL = url.toExternalForm (); String newURL = oldURL.replaceAll ("test-classes", "classes"); URL result; try { result = newURL.equals (oldURL) ? url : new URL (newURL); } catch (MalformedURLException e) { // Whatever } return result; } } 

अपनी मज़बूत परियोजना में अपनी persistence.xml के साथ परीक्षण डाल दिया

OpenEJB का उपयोग करते समय, persistence.xml को वैकल्पिक डिस्क्रिप्टर के साथ ओवरराइड किया जा सकता है: http://tomee.apache.org/alternate-descriptors.html

मुझे अलग-अलग मेवेन प्रोफाइल का उपयोग करने का सुझाव था, जहां आप अपने डेटाबेस को संशोधित कर सकते हैं। प्रॉपर्टीटीज़ फाइलें और एक डाटाबेस है। प्रोफाइल प्रति प्रोफ़ाइल।

इस तरह आपको .properties को छोड़कर किसी भी अन्य कॉन्फ़िगरेशन फ़ाइलों के डुप्लिकेट को रखने की आवश्यकता नहीं है।

 <properties> <!-- Used to locate the profile specific configuration file. --> <build.profile.id>default</build.profile.id> <!-- Only unit tests are run by default. --> <skip.integration.tests>true</skip.integration.tests> <skip.unit.tests>false</skip.unit.tests> <integration.test.files>**/*IT.java</integration.test.files> </properties> <profiles> <profile> <id>default</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- Specifies the build profile id, which is used to find out the correct properties file. This is not actually necessary for this example, but it can be used for other purposes. --> <build.profile.id>default</build.profile.id> <skip.integration.tests>true</skip.integration.tests> <skip.unit.tests>false</skip.unit.tests> </properties> <build> <filters> <!-- Specifies path to the properties file, which contains profile specific configuration. In this case, the configuration file should be the default spring/database.properties file --> <filter>src/main/resources/META-INF/spring/database.properties</filter> </filters> <resources> <!-- Placeholders found from files located in the configured resource directories are replaced with values found from the profile specific configuration files. --> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> <!-- You can also include only specific files found from the configured directory or exclude files. This can be done by uncommenting following sections and adding the configuration under includes and excludes tags. --> <!-- <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> --> </resource> </resources> </build> </profile> <profile> <id>integration</id> <properties> <!-- Specifies the build profile id, which is used to find out the correct properties file. This is not actually necessary for this example, but it can be used for other purposes. --> <build.profile.id>integration</build.profile.id> <skip.integration.tests>false</skip.integration.tests> <skip.unit.tests>true</skip.unit.tests> </properties> <build> <filters> <!-- Specifies path to the properties file, which contains profile specific configuration. In this case, the configuration file is searched from spring/profiles/it/ directory. --> <filter>src/main/resources/META-INF/spring/profiles/${build.profile.id}/database.properties</filter> </filters> <resources> <!-- Placeholders found from files located in the configured resource directories are replaced with values found from the profile specific configuration files. --> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> <!-- You can also include only specific files found from the configured directory or exclude files. This can be done by uncommenting following sections and adding the configuration under includes and excludes tags. --> <!-- <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> --> </resource> </resources> </build> </profile> </profiles> 

यूनिट परीक्षणों और एकीकरण परीक्षणों के लिए असफल रहने की सहायता से, आपने काम किया है

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12</version> <configuration> <junitArtifactName>org.junit:com.springsource.org.junit</junitArtifactName> <!--see: https://issuetracker.springsource.com/browse/EBR-220--> <printSummary>false</printSummary> <redirectTestOutputToFile>true</redirectTestOutputToFile> <!-- Skips unit tests if the value of skip.unit.tests property is true --> <skipTests>${skip.unit.tests}</skipTests> <!-- Excludes integration tests when unit tests are run. --> <excludes> <exclude>${integration.test.files}</exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12</version> <configuration> <!-- Skips integration tests if the value of skip.integration.tests property is true --> <skipTests>${skip.integration.tests}</skipTests> <includes> <include>${integration.test.files}</include> </includes> <forkMode>once</forkMode> <!-- <reuseForks>false</reuseForks> <forkCount>1</forkCount> --> </configuration> <executions> <execution> <id>integration-test</id> <goals> <goal>integration-test</goal> </goals> </execution> <execution> <id>verify</id> <goals> <goal>verify</goal> </goals> </execution> </executions> </plugin> 

अब आपको अपने यूनिट परीक्षणों और mvn verify -Pintegration लिए बस mvn verify -Pintegration परीक्षण की mvn verify -Pintegration है – अपने एकीकरण परीक्षणों के लिए mvn verify -Pintegration । जाहिर है आपको निर्दिष्ट करना चाहिए। डेटाबेस (प्रोफाइल्स) पथ (या अन्यत्र) में निर्दिष्ट करें और रास्तों को परिवर्तित करें।

आधार पर संदर्भ: http://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/

यह हाइबरनेट के उचित नियंत्रण से अमीर विक्रेता के उत्तर का एक्सटेंशन है जिसे क्लासपाथ और प्री-टेस्टिंग स्टेट रिस्टोरेशन पर कई persistence.xml फ़ाइलों को ढूंढने में मदद करता है।

सेट अप:

तैनाती / पैकेजिंग के लिए एक दृढ़ फ़ाइल बनाएं और एक परीक्षण के लिए:

  • src / मुख्य / संसाधन / persistence.xml

  • src / test / resources / persistence- testing .xml

अपने pom.xml में प्लगइन अनुभाग में इसे जोड़ें:

  <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> <executions> <execution> <id>copy-test-persistence</id> <phase>process-test-resources</phase> <configuration> <tasks> <echo>renaming deployment persistence.xml</echo> <move file="${project.build.outputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml.proper"/> <echo>replacing deployment persistence.xml with test version</echo> <copy file="${project.build.testOutputDirectory}/META-INF/persistence-testing.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml" overwrite="true"/> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> <execution> <id>restore-persistence</id> <phase>prepare-package</phase> <configuration> <tasks> <echo>restoring the deployment persistence.xml</echo> <move file="${project.build.outputDirectory}/META-INF/persistence.xml.proper" tofile="${project.build.outputDirectory}/META-INF/persistence.xml" overwrite="true"/> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> 

अन्य समाधानों पर लाभ

  • कोई अतिरिक्त जावा कोड आवश्यक नहीं है
  • क्लासपाथ पर केवल एक persistence.xml
  • उम्मीद के मुताबिक दोनों भवन और परीक्षण कार्य
  • कंसोल पर आउटपुट का वर्णन (गूंज)
  • राज्य के पैकेजिंग के लिए 100% बहाल किया गया है। कोई बचे हुए फाइल नहीं

इस उपयोग के मामले के लिए एक और विकल्प कई हठ इकाइयों को जोड़ना होगा, एक के लिए उत्पादन कहता है और एक दूसरे के लिए परीक्षण और इंटिविटी EntityManagerFactory तदनुसार।

वास्तविक परियोजना के दृढ़ता। एक्सएमएल में दृढ़ता-इकाइयों को दो जगह दें और अपने परीक्षण के मामलों को सही एंटिटाइजर को इंजेक्ट करें। नीचे दिए गए उदाहरण में यह दिखाया गया है कि चालक के साथ कैसे करना है। कृपया ध्यान दें कि मैंने पूर्णता के लिए कुछ मॉकिटू मजाक में छोड़ा है, मचिता विशिष्ट कोड को तदनुसार चिह्नित किया गया है और इंजेक्शन के लिए आवश्यक नहीं है।

 public class HibernateTestDatabaseProvider extends AbstractModule { private static final ThreadLocal<EntityManager> ENTITYMANAGER_CACHE = new ThreadLocal<>(); @Override public void configure() { } @Provides @Singleton public EntityManagerFactory provideEntityManagerFactory() { return Persistence.createEntityManagerFactory("my.test.persistence.unit"); } @Provides public CriteriaBuilder provideCriteriaBuilder(EntityManagerFactory entityManagerFactory) { return entityManagerFactory.getCriteriaBuilder(); } @Provides public EntityManager provideEntityManager(EntityManagerFactory entityManagerFactory) { EntityManager entityManager = ENTITYMANAGER_CACHE.get(); if (entityManager == null) { // prevent commits on the database, requires mockito. Not relevant for this answer entityManager = spy(entityManagerFactory.createEntityManager()); EntityTransaction et = spy(entityManager.getTransaction()); when(entityManager.getTransaction()).thenReturn(et); doNothing().when(et).commit(); ENTITYMANAGER_CACHE.set(entityManager); } return entityManager; } }