2013/04/06

Thought static method can't be easy to mock, stub nor track? Wrong!

No matter why, no matter is it a good idea. Sometimes one just wants to check or it's necessary to be done. Mock a static method, woot? Impossibru!

In pure Java world it is still a struggle. But Groovy allows you to do that really simple. Well, not groovy alone, but with a great support of Spock.

Lets move on straight to the example. To catch some context we have an abstract for the example needs. A marketing project with a set of offers. One to many.

import spock.lang.Specification

class OfferFacadeSpec extends Specification {

    OfferFacade facade = new OfferFacade()

    def setup() {
        GroovyMock(Project, global: true)
    }

    def 'delegates an add offer call to the domain with proper params'() {
        given:
            Map params = [projId: projectId, name: offerName]

        when:
            Offer returnedOffer = facade.add(params)

        then:
            1 * Project.addOffer(projectId, _) >> { projId, offer -> offer }
            returnedOffer.name == params.name

        where:
            projectId | offerName
            1         | 'an Offer'
            15        | 'whasup!?'
            123       | 'doskonała oferta - kup teraz!'
    }
}
So we test a facade responsible for handling "add offer to the project" call triggered  somewhere in a GUI.
We want to ensure that static method Project.addOffer(long, Offer) will receive correct params when java.util.Map with user form input comes to the facade.add(params).
This is unit test, so how Project.addOffer() works is out of scope. Thus we want to stub it.

The most important is a GroovyMock(Project, global: true) statement.
What it does is modifing Project class to behave like a Spock's mock. 
GroovyMock() itself is a method inherited from SpecificationThe global flag is necessary to enable mocking static methods.
However when one comes to the need of mocking static method, author of Spock Framework advice to consider redesigning of implementation. It's not a bad advice, I must say.

Another important thing are assertions at then: block. First one checks an interaction, if the Project.addOffer() method was called exactly once, with a 1st argument equal to the projectId and some other param (we don't have an object instance yet to assert anything about it).
Right shit operator leads us to the stub which replaces original method implementation by such statement.
As a good stub it does nothing. The original method definition has return type Offer. The stub needs to do the same. So an offer passed as the 2nd argument is just returned.
Thanks to this we can assert about name property if it's equal with the value from params. If no return was designed the name could be checked inside the stub Closure, prefixed with an assert keyword.

Worth of  mentioning is that if you want to track interactions of original static method implementation without replacing it, then you should try using GroovySpy instead of GroovyMock.

Unfortunately static methods declared at Java object can't be treated in such ways. Though regular mocks and whole goodness of Spock can be used to test pure Java code, which is awesome anyway :)

14 comments:

  1. "Nice and good article.. it is very useful for me to learn and understand easily.. thanks for sharing your valuable information and time.. please keep updating.php jobs in hyderabad.
    "

    ReplyDelete
  2. Nice opinion, I completely agree with you. But sometimes I do it with help of little bit other method, that I read on this nice service with java static method https://explainjava.com/java-static-methods/ that always helped mo to learn Java when I was a beginner!

    ReplyDelete

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

    تعتبر شركتنا افضل كشف تسربات المياه بجده داخل المملكه حيث ان شركتنا لديها قدره كبيره جدا علي معرفه اماكن التسربات وتضع لكم الحل الامثل للقضاء الصفرات للعزل علي هذه المشكله فنحن نقدم لكم خدمه فريده من نوعها والقضاء علي مشاكل التسربات تماما فنحن نعمل وفق منظومه عمل متكامله الصفرات لكشف لتسربات المياه وراقيه جدا ونقدم لكم افضل اسليب الكشف وارقاها علي الاطلاق ونوفر اسلوب فني عالي جدا ونجتهد لنخرج لكم عمل يليق بكم ويليق باسم شركتنا الكبير جدا لان شركتنا هي اكبر.

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

    ReplyDelete
  4. تعد شركة ركن الامانة (0505561372) من الشركات المتخصصة فى اعمال التنظيف و النقل و المكافحة بالمنطقة الجنوبية فى المملكة العربية السعودية فهى تقدم خدمات متميزة وعلى اعلى مستوى من الخبرة و التقنية بالاعتماد على عمال مدربين ومتميزين فى عمالهم ونقدم خدمات باقل الاسعار التى تناسب جميع عملائنا الكرام فتواصلوا معنا
    شركة تنظيف بخميس مشيط
    شركة تنظيف منازل بخميس مشيط
    شركة تنظيف كنب بخميس مشيط
    شركة عزل اسطح بخميس مشيط
    شركة مكافحة حشرات بخميس مشيط

    ReplyDelete
  5. AWS Training in Bangalore - Live Online & Classroom
    myTectra Amazon Web Services (AWS) certification training helps you to gain real time hands on experience on AWS. myTectra offers AWS training in Bangalore using classroom and AWS Online Training globally. AWS Training at myTectra delivered by the experienced professional who has atleast 4 years of relavent AWS experince and overall 8-15 years of IT experience. myTectra Offers AWS Training since 2013 and retained the positions of Top AWS Training Company in Bangalore and India.


    IOT Training in Bangalore - Live Online & Classroom
    IOT Training course observes iot as the platform for networking of different devices on the internet and their inter related communication. Reading data through the sensors and processing it with applications sitting in the cloud and thereafter passing the processed data to generate different kind of output is the motive of the complete curricula. Students are made to understand the type of input devices and communications among the devices in a wireless media.

    ReplyDelete
  6. تعمل شركة اللمسه في مكافحة الحشرات مثل النمل والصراصير وجميع انواع الحشرات بأبها الان ، وتعتبر شركة اللمسه من اشهر شركات مكافحة الحشرات في السعودية , لدينا عمالة مدربة ومتخصصة المواد المستخدمة فى مكافحة الحشرات غير ضارة على الانسان وليس لها روائح نعمل بدون مغادرة المنزل نعمل على راحة عملائنا .
    شركة مكافحة النمل الابيض بنجران
    شركة رش مبيدات بالخرج
    شركة مكافحة حشرات بالخرج
    شركة مكافحة النمل الابيض بالخرج
    شركة رش مبيدات بأبها
    شركة مكافحة حشرات بأبها
    شركة مكافحة النمل الابيض بأبها
    شركة رش مبيدات بنجران
    شركة مكافحة حشرات بنجران
    شركة رش مبيدات بالعينه


    ReplyDelete
  7. هل تبحث عن شركة متخصصة فى خدمات التنظيف بالطائف بافضل المعدات والسوائل وثقة تمة فى العمل ودقة فى النتائج كل هذه المميزت توفرها شركة الخليج الشركة الافضل والامثل فى الخدمات المنزلية بالطائف وبما اننا الشركة الافضل والامثل بدون منافس سوف نسعى لتوفر افضل الخدمات باقل تكلفة وبقدر كبير من الاهتمام والدقة عزيزى اينما كنت فى اى منطقة ا وحى تابع لمدينة الطائف اتصل بنا وسوف نصلك فى الحال شركة الخليج للخدمات المنزلية شركة تنظيف منازل بالطائف
    شركة تنظيف فلل بالطائف
    شركة تنظيف خزانات بالطائف
    شركة تسليك مجارى بالطائف
    شركة رش مبيدات بالطائف
    شركة مكافحة نمل ابيض بالطائف
    شركة مكافحة حشرات بالطائف
    شركة عزل اسطح بالطائف
    شركة عزل خزانات بالطائف

    ReplyDelete