Groovy Spock

Labai keistas jausmas, kai dalykas diena po dienos sukeliantis tikrai nemažai stiprių emocijų ima ir žingsnis po žingsnio pradeda tau patikti… Tikrai taip, pradedam mokytis Java programavimo kalbą 🙂

Ir tam kad nors kiek praskaidrinti dieną unit testų rašymui buvo pasirinktas Spock Framework kuriame naudojama Groovy (irgi naujas dalykas man!). Emocija – visai šaunus derinys. Vienas iš patraukliausių dalykų man Groovy ateinant iš PHP pasaulio, yra ta visa „magija“ padedanti pasiekti testuojamų klasių protected laukus be pakeitimų pačiose klasėse, įrašyti/paimti duomenis, patogiai mock’inti servisus, „pašerti“ duomenis testavimui. O ir patys testai tiesiog gražiai atrodo ir lengvai skaitomi net šį įrankį pirmą kartą matančiam žmogui.

Štai pvz. toks Java kodas:

public class SomeService
{
    private SomeClient client;

    public SomeService(SomeClient client)
    {
        this.client = client;
    }

    public Result getData(String personalCode)
    {
        if (personalCode == null || personalCode.isEmpty()) {
            throw new IllegalArgumentException("Personal code is mandatory");
        }

        return client.getResult(personalCode);
    }
}
public class SomeClient
{
    public Result getResult(String personalCode)
    {
        Result result = new Result();
        // ... duomenys keliauja į result objektą

        return result;
    }
}
public class Result
{
    public String personalCode;

    public String data;

    ...
}

galėtų būti ištestuotas tokiu būdu:

class SomeServiceSpec extends Specification {

    def "Should return some data"() {
        given:
            def client = Mock(SomeClient.class)
            def service = new SomeService(client)
        and:
            client.getResult(personalCode) >> new Result(personalCode: personalCode, data: "Some example data")
        expect:
            Result actual = service.getData(personalCode)
            actual.personalCode == personalCode
            actual.data == "Some example data"
        where:
            personalCode << ["39012120011", "39012120022", "39012120033", "39012120044"]
    }

    def "Should not allow empty personal code"() {
        given:
            def service = new SomeService(Mock(SomeClient.class))
        when:
            service.getData(personalCode)
        then:
            IllegalArgumentException exception = thrown()
            exception.message == "Personal code is mandatory"
        where:
            personalCode << ["", null]
    }
}

Kaip įdėti Spock į projektą?

Mano konkrečiu atveju build.gradle dependencies sekcija atrodo taip:

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    compile 'net.bytebuddy:byte-buddy:1.7.9'

    testCompile "org.spockframework:spock-core:1.1-groovy-2.4"
}

Spock’as dar „paprašė“ pridėti byte-buddy biblioteką, kad galėtų Mock’inti ir Stub’inti.