سؤال

أنا باستخدام jmockit لاختبار وحدة (مع TestNG) و أنا أعاني من مشكلة في استخدام التوقعات فئة تسخر من الطريقة التي تأخذ نوع بدائي (منطقية) كمعلمة ، باستخدام المنظر.هنا بعض التعليمات البرمجية التي يوضح المشكلة.

/******************************************************/
import static org.hamcrest.Matchers.is;

import mockit.Expectations;

import org.testng.annotations.Test;

public class PrimitiveMatcherTest {
  private MyClass obj;

  @Test
  public void testPrimitiveMatcher() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo(with(is(false))), "bas");
      }
    };

    assert "bas".equals(obj.getFoo(false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(boolean arg) {
      if (arg) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}
/******************************************************/

الخط التي تحتوي على الدعوة إلى invokeReturning(...) يلقي NullPointerException.

إذا قمت بتغيير هذه الدعوة إلى عدم استخدام المنظر, كما في:

invokeReturning(c.getFoo(false), "bas");

فإنه يعمل على ما يرام.هذا ليس جيدا بالنسبة لي, لأنه في بلدي رمز حقيقي أنا في الحقيقة تسخر متعددة المعلمة طريقة لا تحتاج إلى استخدام المنظر على حجة أخرى.في هذه الحالة, توقعات الدرجة يتطلب أن كل الحجج استخدام المنظر.

أنا متأكد من أن هذا هو الخلل ، أو ربما ليس من الممكن استخدام Matchers مع أنواع بدائية (هذا يجعلني حزينة).وقد أي شخص واجه هذه المشكلة ، ومعرفة كيفية الحصول على من حوله ؟

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

المحلول 2

وبالتالي فإن المشكلة تبدو في التوقعات.مع():

   protected final <T> T with(Matcher<T> argumentMatcher)
   {
      argMatchers.add(argumentMatcher);

      TypeVariable<?> typeVariable = argumentMatcher.getClass().getTypeParameters()[0];

      return (T) Utilities.defaultValueForType(typeVariable.getClass());
   }

الدعوة إلى typeVariable.getClass() لا ما صاحب البلاغ تتوقع ، والدعوة إلى المرافق.defaultValueFor نوع إرجاع null.دي autoboxing مرة أخرى بدائية قيمة منطقية حيث NPE يأتي من.

أنا ثابت عليه عن طريق تغيير invokeReturning(...) دعوة إلى:

invokeReturning(withEqual(false)), "bas");

أنا لم يعد استخدام المنظر هنا, ولكن كانت جيدة بما يكفي للحصول على ما أريد.

نصائح أخرى

المسألة هي مزيج من التوقع استخدام هذا Matchers لا يدعم نوع بدائي.

على Matchers رمز تعتمد على النوعية التي أساسا لا يدعم نوع بدائي.عادة استخدام Matchers هو أكثر مطابقة القيمة ؛ مع لصناعة السيارات في الملاكمة/علبته feater في جافا 5, هذه هي عادة ليست مشكلة.

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

أنا آسف لأنني لا أستطيع أن أقول لك أي حل بديل لهذه.ربما شخص آخر يمكن أن تساعد.

لقد غيرت JMockit (الإصدار 0.982) بحيث "مع(هو(كاذبة))" وغيرها الاختلافات الآن يعمل كما هو متوقع (لم يعد بإرجاع null, ولكن الفعلي الحجة قيمة داخل الداخلية المنظر).

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