2013-03-08 7 views
8

फेंक दिया गया है, मुझे यह पता लगाना प्रतीत नहीं होता कि मेरे परीक्षणों में से कोई एक विफल क्यों हो रहा है।जुनीट परीक्षण विफल रहा है हालांकि अपेक्षित अपवाद

@Test(expected = IllegalArgumentException.class) 
public void complainsIfFromLocIsDifferentObject() throws Throwable { 
    board.set(make(), 1, 3); //Creates different rook from 'piece' 
    assertFalse("ChessPiece Test 2", piece.isValidMove(getValidMove(1, 3), board)); 
} 

मैं एक ब्रेकपाइंट सेट और इस प्रक्रिया को कई बार के माध्यम से चले गए हैं:

यहाँ परीक्षण है। यह ChessPiece कक्षा में दूसरे if-statement में जाता है, और अपवाद फेंकने लगता है। प्रक्रिया तब Rook कक्षा में वापस जाती है और super ब्लॉक के नीचे झूठी रिटर्न देती है।

क्या हो रहा है के बारे में कोई विचार? धन्यवाद

प्रासंगिक कोड:

public class Rook extends ChessPiece { 

    @Override 
    public boolean isValidMove(Move m, IChessBoard b) { 
     if (super.isValidMove(m, b) == false) 
      return false; 

     // Add logic specific to rook 
     if(m.fromRow == m.toRow || m.fromColumn == m.toColumn) 
      return true; 
     else 
      return false; 
    } 
} 


public abstract class ChessPiece implements IChessPiece { 

    @Override 
    public boolean isValidMove(Move m, IChessBoard b) { 

     //Verify that there is a piece at the origin 
     if (b.pieceAt(m.fromRow,m.fromColumn) == null) 
      throw new IllegalArgumentException(); 

     // Verify that this piece is located at move origin 
     IChessPiece piece = b.pieceAt(m.fromRow, m.fromColumn); 
     if (this != piece) 
      throw new IllegalArgumentException(); 
    } 
} 
+1

यह समझना बहुत मुश्किल है कि आपके द्वारा दिए गए आंशिक कोड * बस * से क्या हो रहा है। क्या आप इसे संक्षिप्त लेकिन * पूर्ण * उदाहरण में सरल बना सकते हैं? और यदि आप अपवाद फेंकने के लिए 'isValidMove' की अपेक्षा कर रहे हैं, तो आप * एक * दावा भी करेंगे (जिसे आप नहीं पहुंचेंगे)? –

+2

ओह, और आपका 'चेसपिस.इस वैलिडमोव' कार्यान्वयन अमान्य कोड है - यह कुछ भी वापस नहीं करता है। इससे पता चलता है कि आप जिस कोड को पोस्ट कर चुके हैं उसे नहीं चला रहे हैं। –

+0

testfailure क्या कहता है? –

उत्तर

3

It goes into the second if-statement in the ChessPiece class, and seems to throw the exception. The process then goes back to the Rook class and returns false under the super block.

क्या हो रहा है Rook की isValidMove() कक्षा में पहली पंक्ति है super प्रणाली को बुलाती है तो नियंत्रण वहाँ चला जाता है, लेकिन दूसरी if की स्थिति के कारण पूरा नहीं किया जा रहा यह IllegalArgumentException फेंकता है और उसके बाद वापस बच्चे वर्ग यानी Rook पर वापस लौटाता है और यह return false नहीं हो सकता है क्योंकि सुपर ने अपवाद फेंक दिया है, इसलिए अपवाद को इस विधि से बाहर फेंक दिया जाएगा और जूनी से फिर से फेंक दिया जाएगा टी complainsIfFromLocIsDifferentObject विधि।

यह जुनीट ढांचे द्वारा समझा जाएगा और परीक्षण केस पास करना चाहिए।

जांचें कि क्या आपके पास टेस्ट केस क्लास में @RunWith(value = BlockJUnit4ClassRunner.class) है।

अद्यतन:

@RunWith(value = BlockJUnit4ClassRunner.class) 
public class Test extends TestCase{ 

    @Test(expected = IllegalArgumentException.class) 
    public void test1() throws Throwable{ 
     assertFalse(throwException()); 
    } 

    private boolean throwException(){ 
     throw new IllegalArgumentException(); 
    } 
} 

इस परीक्षण का मामला मेरे लिए गुजरता है।

+0

मेरे पास टेस्ट केस क्लास पर @RunWith (BlockJUnit4ClassRunner.class) नहीं है। जब मैं इसे जोड़ता हूं तो मुझे यह कहते हुए त्रुटि मिलती है कि" विशेषता मूल्य टिप्पणी का प्रकार RunWith " क्या है कि क्या करने की कोशिश, वैसे भी है के लिए अपरिभाषित है? – JZachow

+1

' @RunWith (मूल्य = BlockJUnit4ClassRunner.class) 'यह बजाय –

+0

कि कोड काम उपयोग करें, लेकिन परीक्षण अभी भी विफल हो रहा है। – JZachow

1

आप एक टिप्पणी JUnit में लिखने के रूप में आपको बताता है कि क्या गलत है:

I get "java.lang.AssertionError:Expected exception: java.lang.IllegalArgumentException

आप से पहले की उम्मीद अपवाद फेंक दिया जाता है एक अभिकथन से शायद एक AssertionError मिलता है, या क्योंकि अपवाद संभाला और हो जाता है तो एक अभिकथन मार डाला जो विफल रहता है।

आप टिप्पणी से 'उम्मीद' मूल्य निकालते हैं JUnit आप सटीक स्थान जहां दावे विफल रहा है दे देंगे (उर्फ स्टैकट्रेस)

0

आमतौर पर मैं कोड के आसपास JUnit दावे जो मैं करने के लिए अपवाद की उम्मीद नहीं डाल चाहते हैं फेंकना।

तो

@Test(expected = IllegalArgumentException) 
public void test() { 
    board.set(make(), 1, 3); //Creates different rook from 'piece' 
    piece.isValidMove(getValidMove(1, 3), board); 
} 

अन्यथा अपवाद JUnit ज़ोर बयान है जिसमें एक assertionException में अपवाद लपेटता भीतर फेंक दिया है।

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