2015-06-28 5 views
6

मैं एकीकरण परीक्षण के लिए, मेरे परीक्षण वर्गों पर स्प्रिंग बूट की सुविधाजनक एनोटेशन का उपयोग कर रहा हूं।एक ही एनोटेशन में कई स्प्रिंग टेस्ट एनोटेशन कैसे गठबंधन करें?

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Config.class) 
@IntegrationTest 
@Sql({"classpath:rollback.sql", "classpath:create-tables.sql"}) 
@Transactional 

मैं यह काफी कॉपी/प्रत्येक परीक्षा वर्ग पर इस पूरे ब्लॉक को चिपकाने के लिए बदसूरत पाया है, इसलिए मैं अपने खुद के @MyIntegrationTest एनोटेशन बनाया है

@SpringApplicationConfiguration(classes = Config.class) 
@IntegrationTest 
@Sql({"classpath:database-scripts/rollback.sql", "classpath:database-scripts/create-tables.sql", "classpath:database-scripts/insert-test-data.sql"}) 
@Transactional 
@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(value = RetentionPolicy.RUNTIME) 
@interface MyIntegrationTest { 
} 

हालांकि, अगर मैं अपने नए एनोटेशन में @RunWith(SpringJUnit4ClassRunner.class) जोड़ने , तो जुनीट अपने डिफ़ॉल्ट धावक के साथ भाग जाएगा - जो वांछनीय नहीं है। तो अभी के लिए मुझे दो एनोटेशन का उपयोग करना होगा।

@RunWith(SpringJUnit4ClassRunner.class) 
@MyIntegrationTest 

मैं इसे अभी के लिए ठीक है, लेकिन वहाँ इन टिप्पणियों को संयोजित करने का उपाय है लगता है, तो मैं एक भी एनोटेशन उपयोग करने में सक्षम हो सकता है?

+1

मुझे लगता है कि यह सबसे अच्छा है जो आप प्राप्त कर सकते हैं ... http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#integration-testing-annotations- मेटा – sodik

+0

ठीक है मैंने जुनीट कोड में थोड़ा सा खोला है। 'एनोटेटेडबिल्डर 'कक्षा एनोटेशन के माध्यम से किसी भी रनर का पता लगाने की कोशिश कर रही है, और वे इसका उपयोग करते हैं:' एनोटेशन = currentTestClass.getAnotation (RunWith.class); ', इसलिए यह किसी भी" एनोटेशन पर एनोटेशन "नहीं लाएगा। यकीन नहीं है कि इसे क्यों लागू नहीं किया गया था, लोगों को उनके गिटहब पर पूछेगा। – Guillaume

उत्तर

4

मेटा-एनोटेशन कोड पुन: उपयोग का एकमात्र तरीका नहीं है।

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Config.class) 
@IntegrationTest 
@Sql({"classpath:rollback.sql", "classpath:create-tables.sql"}) 
@Transactional 
abstract class IntegrationTest { 
} 

class FooTest extends IntegrationTest { 

} 

class BarTest extends IntegrationTest { 

} 

मेटा-एनोटेशन के विपरीत, आधार वर्ग से एनोटेशन विरासत दोनों वसंत और JUnit द्वारा समझा जाता है: हम बजाय विरासत का उपयोग करें।

+0

यह मेरे लिए सही जवाब है, भले ही मुझे विरासत से कुछ और उम्मीद हो। जब कोडेबेस बढ़ता है तो हमेशा कुछ युग्मन मुद्दों को लाता है और बाद में अमूर्त वर्ग से छुटकारा पाने में काफी मुश्किल होती है, लेकिन मुझे लगता है कि अब मैं सबसे अच्छी चीज प्राप्त कर सकता हूं। – Guillaume

0

ठीक है तो मैं JUnit GitHub पर इस बारे में कुछ पुराने विचार विमर्श पाया है:

यह व्यापार बंद पठनीयता और के बीच किसी प्रकार का है सूखी साय।

कुछ मेटा-एनोटेशन की अनुमति देने से आईडीई जैसे टूल धीमे हो सकते हैं।

मुझे नहीं लगता कि यह जल्द ही लागू होने के रास्ते पर है, इसलिए अब मुझे अपनी दो टिप्पणियां रखना होगा।

संबंधित मुद्दे