2012-10-05 17 views
5

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

यदि मैं setDbProperties() विधि पर टिप्पणी करता हूं, तो फ़ील्ड आबादी में हैं, लेकिन @Value अकेले एनोटेशन के साथ, मुझे फ़ील्ड में शून्य मान मिलते हैं।

package com.blah; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Properties; 

import org.dbunit.DBTestCase; 
import org.dbunit.PropertiesBasedJdbcDatabaseTester; 
import org.dbunit.dataset.IDataSet; 
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; 
import org.dbunit.operation.DatabaseOperation; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.test.context.ActiveProfiles; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
     "classpath:/WEB-INF/application-context.xml", 
     "classpath:/WEB-INF/application-context-test.xml" }) 
@ActiveProfiles("test") 
public abstract class BaseDbTestCase extends DBTestCase { 

    @Value("${test.db.connection.url}") 
    private String connectionUrl; 

    @Value("${test.db.driver.class}") 
    private String driverClass; 

    @Value("${test.db.username}") 
    private String dbUserName; 

    @Value("${test.db.password}") 
    private String dbPassword; 

    @Value("${test.db.datasource.path}") 
    private String dataSource; 

    public BaseDbTestCase(String name) throws IOException { 

     super(name); 

     // setDbProperties(); 

     System.setProperty(
       PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, 
       driverClass); 
     System.setProperty(
       PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, 
       connectionUrl); 
     System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, 
       dbUserName); 
     System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, 
       dbPassword); 
    } 

    @After 
    public void after() throws Exception { 
     DatabaseOperation.DELETE_ALL.execute(getConnection(), getDataSet()); 
    } 

    @Override 
    protected IDataSet getDataSet() throws Exception { 
     return new FlatXmlDataSetBuilder() 
       .build(new FileInputStream(dataSource)); 
    } 

    private void setDbProperties() throws IOException, FileNotFoundException { 

     Properties properties = new Properties(); 

     properties.load(new FileInputStream(
       "src/main/java/resources/application.properties")); 

     connectionUrl = properties.getProperty("test.db.connection.url"); 
     driverClass = properties.getProperty("test.db.driver.class"); 
     dbUserName = properties.getProperty("test.db.username"); 
     dbPassword = properties.getProperty("test.db.password"); 
     dataSource = properties.getProperty("test.db.datasource.path"); 
    } 

    @Override 
    protected DatabaseOperation getSetUpOperation() throws Exception { 
     return DatabaseOperation.REFRESH; 
    } 

    @Override 
    protected DatabaseOperation getTearDownOperation() throws Exception { 
     return DatabaseOperation.NONE; 
    } 

    @Before 
    public void init() throws Exception { 
     DatabaseOperation.REFRESH.execute(getConnection(), getDataSet()); 
    } 

} 

आप देख सकते हैं, अन्य स्प्रिंग (और गैर-स्प्रिंग) एनोटेशन इस वर्ग में काम कर रहे हैं:

यहाँ मेरी आधार परीक्षण क्लास है।

मेरे पास मेरे आवेदन संदर्भ में <context:property-placeholder location="classpath:/resources/application.properties" /> है।

इसके अलावा, @Value एनोटेशन कक्षाओं में ठीक काम कर रहे हैं जो BaseDbTestCase कक्षा का विस्तार करते हैं।

TIA

अद्यतन: @ बीजू के सुझाव लेने init() विधि (@Before साथ एनोटेट) करने के लिए प्रणाली संपत्तियों की सेटिंग स्थानांतरित करने के लिए के बाद, मैं अब निम्नलिखित स्टैक ट्रेस हो रही है। डिबगिंग के आधार पर, त्रुटि को फेंकने से पहले यह कन्स्ट्रक्टर से पहले प्रतीत नहीं होता है।

org.dbunit.assertion.DbAssertionFailedError: driverClass is null 
    at org.dbunit.assertion.DefaultFailureHandler$DefaultFailureFactory.createFailure(DefaultFailureHandler.java:265) 
    at org.dbunit.assertion.DefaultFailureHandler.createFailure(DefaultFailureHandler.java:110) 
    at org.dbunit.assertion.SimpleAssert.fail(SimpleAssert.java:90) 
    at org.dbunit.assertion.SimpleAssert.assertTrue(SimpleAssert.java:77) 
    at org.dbunit.assertion.SimpleAssert.assertNotNullNorEmpty(SimpleAssert.java:61) 
    at org.dbunit.JdbcDatabaseTester.<init>(JdbcDatabaseTester.java:103) 
    at org.dbunit.PropertiesBasedJdbcDatabaseTester.<init>(PropertiesBasedJdbcDatabaseTester.java:68) 
    at org.dbunit.DBTestCase.newDatabaseTester(DBTestCase.java:70) 
    at org.dbunit.DatabaseTestCase.getDatabaseTester(DatabaseTestCase.java:109) 
    at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:151) 
    at junit.framework.TestCase.runBare(TestCase.java:132) 
    at junit.framework.TestResult$1.protect(TestResult.java:110) 
    at junit.framework.TestResult.runProtected(TestResult.java:128) 
    at junit.framework.TestResult.run(TestResult.java:113) 
    at junit.framework.TestCase.run(TestCase.java:124) 
    at junit.framework.TestSuite.runTest(TestSuite.java:243) 
    at junit.framework.TestSuite.run(TestSuite.java:238) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
+0

मुझे एक ही समस्या है। क्या आपको समाधान मिल सकता है? –

उत्तर

1

कारण मुझे लगता है कि है, क्योंकि जब आप अपने BaseDbTestCase BaseDbTestCase में @ContextConfiguration के आधार पर एक नया परीक्षण का मामला निकाले जाते हैं वास्तव में ली गई परीक्षा के मामले में दिखाई नहीं देता है - @ContextConfiguration अपने अंतिम परीक्षण मामले पर हो गया है।

अद्यतन:

क्या मैं ऊपर डाल दिया है सही नहीं है, मैं एक बार परीक्षण किया है और यह @ContextConfiguration और @RunWith तरह लग रहा है यहां तक ​​कि में आधार वर्ग के लिए पर्याप्त है और इसे सही ढंग आधार में @Value क्षेत्रों में injects कक्षा।

अब आपके पास यह मुद्दा है क्योंकि आप कन्स्ट्रक्टर में चर उपलब्ध होने की उम्मीद कर रहे हैं - वे नहीं होंगे, क्योंकि उदाहरण के बाद @Value हल हो गया है - इसलिए आपके मामले में जब आप इसकी अपेक्षा कर रहे हैं निर्माता में उपस्थित होने के लिए यह असफल हो जाएगा। इसके बजाय आपको @Before में गुणों को सेट करने में सक्षम होना चाहिए जूनिट

+0

यह कोई फर्क नहीं पड़ता कि '@ ContextConfiguration' कहां है। किसी भी तरह से, मेरे क्षेत्र '@ वैल्यू' के साथ एनोटेटेड नहीं होते हैं। – Luke

+0

एक अद्यतन उत्तर जोड़ा गया - कारण यह है कि आप मूल्यकार को कन्स्ट्रक्टर में प्रतिबिंबित करने की अपेक्षा कर रहे हैं जबकि '@ Value' को पोस्ट निर्माण का हल किया गया है। –

+0

किसी कारण से, इस विशेष मामले में, सिस्टम गुणों की सेटिंग कन्स्ट्रक्टर में होती है, अन्यथा मैं कभी भी कन्स्ट्रक्टर को नहीं निकालता। इसके बजाय, मुझे स्टैक ट्रेस मिलता है मैंने अपना प्रश्न अपडेट किया है। कोई विचार? – Luke

0

एक ठोस वर्ग है जो बेसडीबीटेस्टकेस को बढ़ाता है और कंक्रीट क्लास में @ कोन्टेक्स्ट कॉन्फ़िगरेशन डालता है। अपने अन्य टेस्ट कक्षाओं को इस ठोस वर्ग का विस्तार करें।

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