سؤال

لدي مشكلة مع Mockito.

هل من الممكن القيام مثل هذا الشيء:

ClassX x = mock(ClassX.class)
when(x.methodB()).thenReturn("toto");
String result = x.methodA();

أنا أعمل مع Mockito 1.7.

رأيت أنه كان هناك نظام "جاسوس" لكنهم يقولون إنه لا ينصح باستخدامه (لماذا؟) على العنصر الذي نختبره ...

جربت وظيفة التجسس على أي حال لكنني أحصل على سلوك غريب.

تحقق من ما أريد أن أفعله:

رمز حقيقي:

String methodA(String arg) {
    return this.methodB(arg);
}

String methodB(String arg) {
    return "toto";
}

رمز الاختبار:

@Test
public void testTest() {
    final ClassX x = spy( new ClassX() );
    final String argument = "arg";
    doReturn("good").when(helper).methodB(argument);
    assertTrue(  x.methodB(argument).equals("good") );
    assertTrue(  x.methodA(argument).equals("good") );
}  

كما قالوا ، لقد تجنبت بناء جملة ThenReturn التي قد تكون مشكلة في جاسوس (لكنها لا تعمل على أي حال)

الشيء الغريب هو أن: AssertTrue (x.methodb (الوسيطة) .equals ("جيد")) ؛ على ما يرام

فقط AssertTrue الثاني (X.Methoda (الوسيطة) .equals ("جيد")) ؛ ليس على ما يرام

في الواقع ، يعيد Helper.Methoda (الوسيطة) "Toto" -> النتيجة الحقيقية وليس النتيجة الوهمية

ليس من الممكن إخبار Mockito بإرجاع "جيد" في هذه الحالة ؟؟؟ يبدو عندما يكون طريقة استدعاء فئة الاختبار على ما يرام ، ولكن إذا استدعاء طريقة التجسس بالطريقة التي لم تعد تعمل ...

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

شكرًا

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

المحلول

الجاسوس هو كائن مختلف من الكائن المتجسد. الجاسوس فقط المندوبين إلى الكائن المتجسد. لذلك عندما يستدعي الكائن المسبق طريقة MethodB من Methoda ، فإنه سوف يطلق عليه على نفسه ، وليس على الجاسوس.

نصائح أخرى

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

الأصل: أنا حقًا أحب Mockito ، ولكن هذا هو المكان الوحيد الذي يفوز فيه Easymock. لديّ حلان لك لا يشملان Mockito. الأول هو تجاوز MethodB على مثيل الاختبار الخاص بك. والآخر هو أن يسخر جزئيًا من Easymock:

import org.junit.Test;
import static org.junit.Assert.*;
import static org.easymock.EasyMock.*;

public class PartialMockTest {

    class ClassX {
        String methodA(String arg) {return methodB(arg);}
        String methodB(String arg) {return "toto";}
    }

    @Test
    public void MockitoOnClassX(){
        ClassX classx = mock(ClassX.class);
        when(classx.methodB("hiyas")).thenReturn("tomtom");
        when(classx.methodA(anyString())).thenCallRealMethod();
        String response = classx.methodA("hiyas");
        assertEquals("tomtom",response);
    }


    @Test
    public void OverrideOnClassX() {
        ClassX classx = new ClassX(){@Override String methodB(String arg){return "tomtom";}};
        String response = classx.methodA("hiyas");
        assertEquals("tomtom",response);
    }

    @Test
    public void PartialMockOnClassX() throws NoSuchMethodException {
        ClassX classx = createMockBuilder(ClassX.class).addMockedMethod("methodB").createMock();
        expect(classx.methodA("hiyas")).andReturn("tomtom");
        replay(classx);
        String response = classx.methodA("hiyas");
        assertEquals("tomtom",response);
    }

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