سؤال

قل أن لدي الفئة أ مع

class A {
  final String foo() {
    // .. computing result, contacting database, whatever ..
    return "some computed value";
  }
  // ... and a bazillion other methods, some of them final.
}

الآن لدي فئة ب مع

class B {
  String methodIWantToTest(A a) {
      String output = a.foo();
      // ... whatever this method does, e.g.:
      output += "_suffix";
      return output;
  }
}

كيف يمكنني اختبار وحدة اختبار هذه الطريقة؟ السبب foo() هل هو نهائي لأننا لا نريد فصولنا التي تمتد لتغيير وظائفها. لكن في نفس الوقت لاختبار الوحدة حقًا هذه الطريقة ، لا أريد أن تصل وتشغيلها الفعلية A.foo() طريقة.

هل هناك طريقة لإزالة الكلمة الرئيسية النهائية وإضافة تعليق توضيحي على غرار @finalUnlessTest؟ ماذا تنصح؟ ستكون إعادة إنشاء واجهة إلى واجهة أمرًا صعبًا للغاية ، ويرى كيف هو أحد فصولنا المركزية ، وللأسف جميل مقترنة للغاية.

تحرير #1 آسف ، نسيت أن نذكر ، نحن نتحدث جافا. نحن لا نستخدم إطارًا للسخرية حتى الآن.

إجابه حسنًا ، هكذا: واو. JMockit إنه أمر لا يصدق وهو في عيني التطبيق القاتل لاختبار الرمز القديم. مفيد بشكل لا يصدق وخاصة في حالتي. ًشكراً جزيلا! أنت ستفعل شيئًا مثل ما يلي لمثال psuedo الخاص بي:

class AMock {
   final String foo() {
     return "myTestValue";
   }
}
class Test extends TestCase {
   A mockedA;
   B b;
   protected void setUp() {
      Mockit.redefineMethods( A.class, AMock.class );  // this "pipes" all mocked methods from A to AMock
      mockedA = new A();    // NOT new AMock()!!!
      b = new B();
   }
   public void testB() {
      assertEquals("myTestValue",mockedA.foo());
      assertEquals("myTestValue_suffix",b.methodIWantToTest(mockedA));
   }
}

هل هذا رائع أم ماذا؟

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

المحلول

يمكنك تجربة JMockit مكتبة السخرية.

نصائح أخرى

سأقوم بإزالة "النهائي" وأضع في تعليق "لا تتجاوز هذه الطريقة !!". إذا لم تتمكن من الوثوق بزملاء العمل في عدم اتباع التعليمات البسيطة ، فهذا ميؤوس منه على أي حال.

سوف يتيح لك الرمز التالي أيضًا القيام بذلك. أنا لا أقول أن هذه ممارسة جيدة ، لكنها استخدام مثيرة للاهتمام (سوء المعاملة؟) من الفصول المجهولة.

public class Jobber {

    public final String foo() {
        return fooFactory() ;
    }

    String fooFactory() {
        return "jobber" ;
    }


    public static void main(String[] args) {

        Jobber jobber = new Jobber() { String fooFactory() { return "prefix " + super.fooFactory() ;} } ;

        System.out.println(jobber.foo() );
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top