2013-11-26 2 views
5

पर विचार करें ठेठ DBUnit स्प्रिंग टेस्ट (https://github.com/springtestdbunit/spring-test-dbunit देखें):वसंत autowiring से पहले होने के लिए DBUnit @DatabaseSetup कैसे हो सकता है?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
"classpath:/META-INF/spring/applicationContext-database.xml", 
"classpath:spring-*.xml" 
}) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, 
    DbUnitTestExecutionListener.class }) 
@DatabaseSetup("/dbunit/data.xml") 
public class UnitTest { 

    @Autowired 
    private UnitUnderTest uut; 

    @Test 
    public void shouldInitDB() { 
     ... 
    } 
} 

क्या मैं सत्यापित किया है कि है, और उम्मीद है, Autowiring DatabaseSetup से पहले नहीं होगा। ऐसा इसलिए होना चाहिए क्योंकि DBUnit कॉन्फ़िगर किए गए डेटा स्रोत प्रदान करने के लिए अनुप्रयोग संदर्भ पर निर्भर करता है।

समस्या यह है कि यूनिटयून्डरटेस्ट बीन में @PostConstruct है जहां यह डीबी से कुछ डेटा लोड करता है, लेकिन चूंकि ऑटोवॉयरिंग डीबुनिट सेटअप से पहले होती है, तो डेटा इस चरण में उपलब्ध नहीं होगा।

इस मुद्दे को साफ तरीके से हल करने के तरीके पर कोई विचार?

+1

एक ही मुद्दे की तरह कुछ का उपयोग कर सकते हैं। कोई समाधान? – Puce

+0

यह वास्तव में एक अच्छा समाधान नहीं है, लेकिन मुझे आगे बढ़ने की इजाजत दी गई है। ऑब्जेक्ट से विरासत में आने वाले टेस्ट क्लास बनाएं और बाहरी प्रारंभिकरण के लिए एक विधि का पर्दाफाश करें। @Before परीक्षण में प्रयोग करें। –

+0

अभी तक कोई समाधान नहीं है। एक सभ्य कामकाज भी नहीं। खोज रखेंगे। –

उत्तर

0

आपके पास अपनी परीक्षा कक्षा में एक सेटअप विधि हो सकती है और मैन्युअल रूप से पोस्ट निर्माण विधि को कॉल कर सकती है। वह काम करेगा।

+0

मुझे डर है कि एक गैर समाधान है! ऐसे मामले में मुझे उस विधि को किसी अन्य बीन को कॉल करने की ज़िम्मेदारी पारित करनी होगी। मुझे नहीं लगता कि ऐसा करने की ज़रूरत है। मैं यह सोच रहा हूं कि वसंत-परीक्षण-डबुनिट के पास इस तरह के परिदृश्य का परीक्षण करने का एक क्लीनर, कम घुसपैठ करने वाला तरीका होगा, जो मुझे यकीन है कि वह दुर्लभ नहीं होगा। –

+0

मेरी पोस्टकस्ट्रक्चर विधि डेटाबेस ऑब्जेक्ट को पुनर्प्राप्त करने का प्रयास करती है और ऑटोवॉयरिंग के दौरान यह टूट जाती है, इसलिए यह समाधान मदद नहीं करेगा। – TheBakker

1

आप स्प्रिंग्स रिसोर्सडेटाबेसपोलेटर कर सकते हैं।

मुझे लगता है कि तुम यहाँ इस

@PostConstruct 
public void myInMemryPopulator() { 
final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); 

     try { 

      Resource[] array = resourceResolver.getResources("classpath:/*.sql");  

      for (Resource resource : array) { 

       databasePopulator.addScript(resource); 
      } 
      databasePopulator.populate(dataSource.getConnection()); 

     } catch (IOException | SQLException e) { 
      LOGGER.error("Error in databasePopulator {} ", e); 
     } 

    } 
+0

यदि अभी भी यह मदद नहीं करता है। आप अभिभावक परीक्षण केस बना सकते हैं और पैरेंट टेस्ट केस में स्टेटिक ब्लॉक जोड़ सकते हैं इस विधि को कॉल कर सकते हैं – Niraj

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