سؤال

ما لدي الآن

لدي مثال ثالث من الحزب المفرد الذي يعتمد على صفي قيد الاختبار وأنه يستخدم المفرد System.getenv(String) في مُنشئها. هل من الممكن السخرية من هذه المكالمة؟

حاولت هذا

مثال jMockit

    new Expectations()
    {

        System mockedSystem;
        {
            System.getenv( "FISSK_CONFIG_HOME" ); returns( "." );
        }
    };

لكنه يعطيني EXCEPTION_ACCESS_VIOLATION ويصطدم JVM.

هل هناك طريقة أخرى لتعيين متغير بيئة النظام لاختبار الوحدة؟

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

المحلول

في هذه الحالة ، تحتاج إلى استخدام السخرية الجزئية بحيث لا يعيد JMockit تعريف كل شيء في فئة النظام. سوف يمر الاختبار التالي:

   @Test
   public void mockSystemGetenvMethod()
   {
      new Expectations()
      {
         @Mocked("getenv") System mockedSystem;

         {
            System.getenv("envVar"); returns(".");
         }
      };

      assertEquals(".", System.getenv("envVar"));
   }

سأقوم قريبًا بتنفيذ تعزيز حتى لا تحدث مشكلات مثل هذه عندما يسخر من فصول JRE. يجب أن يكون متاحًا في الإصدار 0.992 أو 0.993.

نصائح أخرى

Powermock طبقات لتكون قادرة على السخرية من فصول النظام.

خيارك الآخر (على افتراض أنك لست اختبار وحدة واجهة برمجة تطبيقات الطرف الثالث) هو إنشاء A for مظهر زائف واجهة برمجة تطبيقات الطرف الثالث التي لديها واجهة لطيفة وسهلة القابلة للسخرية ولديها فئات الاختبار الخاصة بك تستخدم هذا بدلاً من الشيء الحقيقي.

أوه ، يدعم JMockit هذا أيضًا: Package Playtest ؛

import static org.junit.Assert.*;

import mockit.*;
import mockit.integration.junit4.JMockit;

import org.junit.*;
import org.junit.runner.RunWith;

@RunWith(JMockit.class)
public class JMockItTest {

 @Test
 public void mockSystemGetEnv() {
  Mockit.setUpMocks(MockSystem.class); 

  assertEquals("Bye", System.getenv("Hello"));

 }

 @MockClass(realClass = System.class)
 public static class MockSystem {
  @Mock
  public static String getenv(String str) {
   return "Bye";
  }
 }

}

لا يمكنك تغيير البيئة ولكن يمكنك تغيير الوصول إليها: ما عليك سوى لف المكالمة System.getenv() في طريقة أو فئة مساعد ثم يسخر من ذلك.

تحرير] الآن مشكلتك هي كيفية تغيير رمز مكتبة الطرف الثالث. الحل هنا هو استخدام java decompiler وإصلاح الفصل. إذا كنت تريد ، يمكنك إرسال طلب ميزة أيضًا. أضف تلك الفئة الجديدة إلى مجموعة الاختبار الخاصة بك. يجب أن يجعل IDE الخاص بك العثور على الفصل للاختبارات.

نظرًا لأن رمز الاختبار لا يدخل الإنتاج ، يمكنك إجراء اختباراتك وسيستخدم رمز الإنتاج المكتبة الأصلية.

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

تحديث على إجابة @Rogério.

في حالتي مع JMockit 1.25 كان علي أن أفعل ذلك باستخدام واجهة برمجة تطبيقات Mockup:

@Test
public void mockSystemGetenvMethod(){
    new MockUp<System>()
    {
        @Mock
        public String getenv(final String string) {
            return "";
        }
    };

    assertEquals(".", System.getenv("envVar"));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top