2009-07-10 5 views
8

के साथ अपवाद नहीं कर रहा है मैं में अपेक्षित अपवाद के परीक्षण के लिए @Test (अपेक्षित = RuntimeException.class) एनोटेशन का उपयोग करने का प्रयास कर रहा हूं।जूनिट 4: अपेक्षित = स्प्रिंग

@Test(expected = RuntimeException.class) 
    public void testSaveThrowsRuntimeException(){ 

        User user = domain.save(null); 

    } 

और मेरे विधि को बचाने के लिए इस तरह सरल:

public User save(User newUser) { 
     if(newUser == null) { 
      throw new RuntimeException(); 
     } 
     //saving code goes here 
    } 

कोड डिबगिंग के बाद मैं उम्मीद लेकिन इसकी वसंत में बीच में कहीं खाया हो रही है के रूप में है कि कोड अपवाद फेंक पाया मेरे कोड इस प्रकार है ढांचे वर्गों।

org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException 
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1031) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678) 
at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:504) 
at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:277) 
at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:170) 
at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:344) 
at org.springframework.test.context.junit4.SpringMethodRoadie.runAfters(SpringMethodRoadie.java:307) 
at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:338) 
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217) 
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197) 
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:142) 
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
Caused by: javax.transaction.RollbackException 
at org.objectweb.jotm.TransactionImpl.commit(TransactionImpl.java:245) 
at org.objectweb.jotm.Current.commit(Current.java:488) 
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1028) 
... 23 more 

और मुझे यकीन है:

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

किसी को भी कोई विचार है कि क्या गलत हो रहा है?

+0

यदि वसंत हमेशा अपवाद पकड़ लेता है, तो आप ऐसा क्यों नहीं करना चाहते हैं? क्या यह अपेक्षित व्यवहार नहीं है (भले ही आप * क्या * अपेक्षित नहीं थे) –

+0

हाँ यह सच है लेकिन यह बाद में कंसोल पर त्रुटि फेंकता है। तो मैं इसे खुद पकड़ना चाहता हूँ। – ravinikam

उत्तर

4

यहां एक काम-आसपास है जो मैंने जूनिट 4.5 के साथ पाया - @ ट्रान्सएक्शनल और @ एक्सपेक्टेड अपवाद को नेस्टेड फ़ंक्शंस में अलग करें। मुझे लगता है कि एओपी सामान वसंत के साथ समस्या कुछ @ ट्रान्सएक्शनल विधि के आसपास रखती है।

@Test 
@ExpectedException(org.springframework.dao.DataIntegrityViolationException.class) 
public void Test10UniqueName() 
{ 
    DoTest10UniqueName(); 
} 

@Transactional 
public void DoTest10UniqueName() 
{ 
    final String NAME = "NAME"; 
    ProductCategoryDAO dao = DAOFactory.getProductCategoryDAO(); 
    ProductCategory test1 = new ProductCategory(); 
    test1.setName(NAME); 
    ProductCategory test2 = new ProductCategory(); 
    test2.setName(NAME); 
    dao.save(test1); 
    dao.save(test2); 
} 
1

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

+0

पॉल, धन्यवाद, यदि आप स्टैक ट्रेस देखते हैं, तो मैं SpringJUnit4ClassRunner के साथ परीक्षण चला रहा हूं, इसलिए स्प्रिंग TX खेल में आता है। यह @NotTransactional एनोटेशन के साथ काम करता है। – ravinikam

+0

ठीक है, बिल्कुल। या तो इसे सादे पुराने जूनिट के साथ चलाएं, न कि SpringJUnit4ClassRunner के साथ और रनटाइम अपवाद के लिए परीक्षण, या अपेक्षित लेनदेन व्यवहार के लिए परीक्षण। –

6

यह पता चला कि मेरा पहला जवाब गलत था। @Test (अपेक्षित = ...) और @ExpectedException दोनों काम करते हैं, लेकिन the Spring TestContext and Junit 4.5 के बीच कुछ असंगतता है। जूनिट 4.4 का उपयोग करने से मेरे लिए समस्या हल हो गई। आखिरकार।

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