سبب سلوك غير متوقع باستخدام آلية الاستثناء المتوقعة Junit 4؟

StackOverflow https://stackoverflow.com/questions/395317

سؤال

أحاول اختبار طريقة معينة يلقي استثناء متوقع من طريقة. حسب وثائق جونيت 4 و هذه الإجابة كتبت الاختبار على النحو التالي:

@Test(expected=CannotUndoException.class)  
public void testUndoThrowsCannotUndoException() {   
    // code to initialise 'command'

    command.undo();
}

ومع ذلك، فشل هذا الرمز في اختبار Junit، والإبلاغ عن استثناء ذعر (والمتوقع) كخطأ.

الطريقة التي اختبرها لديها فقط هذا في الجسم:

public void undo() {
    throw new CannotUndoException();
}

علاوة على ذلك، يمر الاختبار التالي:

public void testUndoThrowsCannotUndoException() {
    // code to initialise 'command'

    try { 
        command.undo();
        fail();
    } catch (CannotUndoException cue){

    }
}

وهذا يعني أن الاستثناء المتوقع يتم إلقاؤه بالفعل.

أخطط بالفعل لتغيير الطريقة لفعل شيء فعليا، بدلا من إلقاء الاستثناء، لكنها حصلت على فضولي حول ما تسبب في المشكلة، خشية أن يحدث ذلك مرة أخرى في المستقبل.

تم إجراء الشيكات التالية:

  • لا يتم استيراد الأزمة المستوردة في حالة الاختبار الصحيحة الصحيحة
  • الإصدار 4 من Junit هو الوحيد على صففي
  • نظيفة وبناء مساحة عمل Eclipse لم يغير النتيجة

أنا أستخدم Junit 4.1، وفي نفس الاختبار الذي أستخدمه Mockito.

ما الذي يمكن أن يسبب الفشل الخاطئ؟

هل كانت مفيدة؟

المحلول

لقد وجدت المشكلة.

كان Testrunner كنت أستخدمه هو الصحيح (Junit 4)، ومع ذلك، أعلنت فئة الاختبار الخاصة بي بصورة:

public class CommandTest extends TestCase

الذي افترض أنه يسبب عداء اختبار لعلاجه كاختبار جونيت 3. ازلت extends TestCase وتلقى النتائج المتوقعة.

نصائح أخرى

رمز الاختبار الخاص بك يبدو موافق لي.

تحقق من أنك تعمل مع Junit 4 Testrunner، وليس Junit 3.8 Testrunner - هذا قد يكون جيدا الجاني هنا (حاول إطلاق من سطر الأوامر أو فحص سطر الأوامر فقط عند تشغيل الاختبار الخاص بك). قد لا يكون ClassPath من Testrunner الخاص بك هو نفسه كصف مشروعك

هذا هو الحال بشكل خاص داخل IDE. بالتناوب يمكنك محاولة الدفع إلى Junit 4.4 ومعرفة ما إذا كان ذلك يحل مشكلتك. (Junit 4.5 قد يسبب مشاكل أخرى).

كان لدي مشكلة مماثلة وتم إصلاحه عن طريق إضافة التوضيح

@RunWith(JUnit4ClassRunner.class)

الذي يروي اختبار الوحدة لتشغيله مع إصدار 4er من Junit

فضولي.

كتبت ثلاث فصول:

undochand:

public class UndoCommand
{
    public void undo()
    {
        throw new CannotUndoException();
    }
}

الأعلاف:

// Note: extends the unchecked superclass RuntimeException
public class CannotUndoException extends RuntimeException
{
    public CannotUndoException()
    {
        super();
    }

    public CannotUndoException(String message)
    {
        super(message);
    }

    public CannotUndoException(String message, Throwable cause)
    {
        super(message, cause);
    }

    public CannotUndoException(Throwable cause)
    {
        super(cause);    
    }
}

وشركة اختبار جونيت 4.4:

import org.junit.Test;

public class UndoCommandTest
{
    @Test(expected=CannotUndoException.class)
    public void testUndo()
    {
        UndoCommand command = new UndoCommand();

        command.undo();
    }
}

يعمل تماما - جميع الاختبارات تمر، "الأخضر" النتيجة.

إذا قمت بإزالة (المتوقع = ...) من التوضيحية فشل الاختبار، كما هو متوقع.

أنا أستخدم Sun JDK 6، Junit 4.4 و Intellij 7.0.5.

كيف تختلف لك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top