استخدم Mockito للتحقق من عدم استدعاء أي شيء بعد طريقة

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

سؤال

أنا أستخدم Mockito لكتابة اختبار وحدة في Java ، وأود أن أتحقق من أن طريقة معينة هي الاخير دعا على كائن.

أفعل شيئًا كهذا في الكود قيد الاختبار:

row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();

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

لاحظ أنني لا أبحث عن VerifyNomoreNtractions: لا يؤكد أن SavetOdatabase هو آخر شيء يسمى ، وهو يفشل أيضًا إذا اتصلت بأي شيء على الصف لا أتحقق منه صراحة. أود أن أكون قادرًا على قول شيء مثل:

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();

إذا كان ذلك مفيدًا ، فأنا أتحول إلى Mockito من اختبار JMock الذي قام بذلك:

row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
هل كانت مفيدة؟

المحلول

أعتقد أنه يتطلب المزيد من العمل المخصص.

verify(row, new LastCall()).saveToDatabase();

وثم

public class LastCall implements VerificationMode {
    public void verify(VerificationData data) {
        List<Invocation> invocations = data.getAllInvocations();
        InvocationMatcher matcher = data.getWanted();
        Invocation invocation = invocations.get(invocations.size() - 1);
        if (!matcher.matches(invocation)) throw new MockitoException("...");
    }
}

الجواب السابق:

أنت محق. VerifyNoMoreInterctions هو ما تحتاجه.

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verify(row).editABunchMoreStuff();
verify(row).saveToDatabase();
verifyNoMoreInteractions(row);

نصائح أخرى

ليس 100 ٪ في الموضوع ، لكنني كنت أتطلع فقط إلى العثور على عكس التحقق ، وكانت هذه هي النتيجة الوحيدة ذات الصلة ، وينتهي بي الأمر بعد mockito.verifyzerointerctions (Mock) ؛

فقط في حالة ما ينتهي به أي شخص آخر يبحث عن هذا ...

قادني هذا السؤال إلى إجراء بعض التحسينات إلى التحقق API في JMockit (متوفر في الإصدار القادم 0.983).

يتيح لك الحل الذي توصلت إليه الكتابة (في طريقة الاختبار):


    new VerificationsInOrder() {{
        unverifiedInvocations();
        row.saveToDababase();
    }};

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

إذا كنت بالإضافة إلى التحقق أعلاه ، فأنت تريد أيضًا التحقق من أن بعض الطرق الأخرى يتم استدعاؤها بأي ترتيب ، وهي ثانية التحقق يمكن إضافة الكتلة إلى الاختبار (قبل أو بعد الكتلة الأخرى ، لا يهم):


    new Verifications() {{
        row.setSomething(value);
        row.setSomethingElse(anotherValue);
    }};

على الرغم من فترة طويلة بسبب استخدام فئات داخلية مجهولة ، إلا أن هذا الجملة بسيط ومرن ؛ لاحظ كيف يضيف بنية إلى الاختبار وتجنب تكرار مكالمات الطريقة (مثل verify(...)). هناك ما هو أكثر مما وصفته هنا (Hamcrest Matchers ، تعداد الاحتجاج ، وما إلى ذلك) ، ولا يقتصر على التحقق من أساليب المثيل (يمكن الاستهزاء والتحقق من الأساليب الثابتة والمقودات بالطريقة نفسها).

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