Creem la primera prova, en la qual comprovem que el mètode transform(1) ens retorna 1.
packageud4.examples.tdd;importorg.junit.jupiter.api.Test;import staticorg.junit.jupiter.api.Assertions.assertEquals;classFizzBuzzTest{@Test@DisplayName("FizzBuzz class should exist")voidfizzBuzzClassShouldExist(){FizzBuzzfizzBuzz=newFizzBuzz();}}
Aquesta prova fallarà inicialment, ja que la classe FizzBuzz no existeix.
Creem la segona prova, en la qual comprovem que existeix el mètode transform().
@Test@DisplayName("FizzBuzz::transform() method should exist")voidfizzBuzzTransformMethodShouldExist(){FizzBuzzfizzBuzz=newFizzBuzz();fizzBuzz.transform();}
Aquesta prova fallarà ja que el mètode transform() no existeix.
Creem la tercera prova, en la qual comprovem que el mètode transform() ha d'acceptar un nombre enter
com a paràmetre.
@Test@DisplayName("FizzBuzz::transform() method should have an int parameter")voidfizzBuzzTransformMethodShouldHaveIntParameter(){FizzBuzzfizzBuzz=newFizzBuzz();fizzBuzz.transform(1);}
El primer pas per aconseguir que la prova passe és afegir el paràmetre int number al mètode transform().
publicclassFizzBuzz{publicvoidtransform(intn){}}
En aquest punt, si executem les proves, veurem que la prova passa, però l'anterior prova falla
perquè el mètode transform() no pot ser invocat sense paràmetres, per tant, hem de decidir com volem procedir.
En aquest cas, com que la prova que falla és més antiga i prova un comportament que també estem comprovant amb
la prova actual, decidim eliminar-la.
Nota
S'ha comentat en compte d'eliminar-la perquè quede registrat el procés seguit.
publicclassFizzBuzzTest{@Test@DisplayName("FizzBuzz class should exist")voidclassFizzBuzzShouldExist(){FizzBuzzfizzBuzz=newFizzBuzz();}/* @Test @DisplayName("FizzBuzz::transform() method should exist") void fizzBuzzTransformMethodShouldExist() { FizzBuzz fizzBuzz = new FizzBuzz(); fizzBuzz.transform(); } */@Test@DisplayName("FizzBuzz::transform() method should have an int parameter")voidfizzBuzzTransformMethodShouldHaveIntParameter(){FizzBuzzfizzBuzz=newFizzBuzz();fizzBuzz.transform(1);}}
Creem la quarta prova, que provem el primer cas: el mètode transform(1) ens retorna 1.
@Test@DisplayName("FizzBuzz::transform(1) should return 1")voidfizzBuzzTransform_givenValue1_shouldReturn1(){FizzBuzzfizzBuzz=newFizzBuzz();intresult=fizzBuzz.transform(1);assertEquals(1,result);}
Creem la cinquena prova, que provem el segon cas: el mètode transform(2) ens retorna 2.
@Test@DisplayName("FizzBuzz::transform(2) should return 2")voidfizzBuzzTransform_givenValue2_shouldReturn2(){FizzBuzzfizzBuzz=newFizzBuzz();intresult=fizzBuzz.transform(2);assertEquals(2,result);}
Aquesta solució passa la prova que acabem de fer, però no passa la prova anterior, ja que si passem
el valor 1 al mètode transform(), aquest retorna 2 en comptes de 1, per tant, la solució no és vàlida.
Gràcies a haver fet la prova anterior, ens hem adonat que la solució no és vàlida i li hem tret rendiment a la prova escrita.
Una solució que sí que funciona per a les dues proves és la següent:
Passem al primer cas especial: Si el nombre és divisible per 3, retornar "Fizz", per tant, creem la prova:
@Test@DisplayName("FizzBuzz::transform(3) should return Fizz")voidfizzBuzzTransform_givenValue3_shouldReturnFizz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(3);assertEquals("Fizz",result);}
Aquest canvi fa que les proves anteriors fallen, ja que esperen un int i ara reben un String,i per tant, hem de
refactoritzar les proves anteriors perquè esperen un String.
@Test@DisplayName("FizzBuzz::transform(1) should return 1")voidfizzBuzzTransform_givenValue1_shouldReturn1(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(1);assertEquals("1",result);}
En aquesta iteració podríem comprovar el cas 4, que hauria de retornar 4.
@Test@DisplayName("FizzBuzz::transform(4) should return 4")voidfizzBuzzTransform_givenValue4_shouldReturn4(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(4);assertEquals("4",result);}
No obstant això, si executem aquest test veurem que directament passa correctament i per tant,
la funcionalitat que esperem d'aquest test ja ha segut provada anteriorment i no és necessari fer aquesta prova.
Anem a provar el cas 5, que hauria de retornar Buzz.
@Test@DisplayName("FizzBuzz::transform(5) should return Buzz")voidfizzBuzzTransform_givenValue5_shouldReturnBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(5);assertEquals("Buzz",result);}
Anem a provar el cas 6, que hauria de retornar Fizz.
@Test@DisplayName("FizzBuzz::transform(6) should return Fizz")voidfizzBuzzTransform_givenValue6_shouldReturnFizz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(6);assertEquals("Fizz",result);}
Anem a provar el cas 10, que hauria de retornar Buzz.
@Test@DisplayName("FizzBuzz::transform(10) should return Buzz")voidfizzBuzzTransform_givenValue10_shouldReturnBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(10);assertEquals("Buzz",result);}
Anem a provar el cas 15, que hauria de retornar FizzBuzz.
@Test@DisplayName("FizzBuzz::transform(15) should return FizzBuzz")voidfizzBuzzTransform_givenValue15_shouldReturnFizzBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(15);assertEquals("FizzBuzz",result);}
Si executem aquesta prova veurem que falla, ja que el mètode transform() retorna "Fizz" quan el paràmetre és 15,
en compte de "FizzBuzz". Això es deu a que la condició n % 3 == 0 és certa i per tant, retorna "Fizz" i no continua
avaluant les altres condicions. Caldria canviar l'ordre de les condicions perquè la condició n == 15 es comprove
abans que la condició n % 3 == 0.
L'últim cas que ens queda per comprovar és el 30, que hauria de retornar FizzBuzz.
@Test@DisplayName("FizzBuzz::transform(30) should return FizzBuzz")voidfizzBuzzTransform_givenValue30_shouldReturnFizzBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(30);assertEquals("FizzBuzz",result);}
packageud4.examples;importorg.junit.jupiter.api.DisplayName;importorg.junit.jupiter.api.Test;import staticorg.junit.jupiter.api.Assertions.assertEquals;publicclassFizzBuzzTest{@Test@DisplayName("FizzBuzz class should exist")voidfizzBuzzClassShouldExist(){FizzBuzzfizzBuzz=newFizzBuzz();}/* @Test @DisplayName("FizzBuzz::transform() method should exist") void fizzBuzzTransformMethodShouldExist(){ FizzBuzz fizzBuzz = new FizzBuzz(); fizzBuzz.transform(); } */@Test@DisplayName("FizzBuzz::transfrom() should have an int parameter")voidfizzBuzzTransformShouldHaveIntParameter(){FizzBuzzfizzBuzz=newFizzBuzz();fizzBuzz.transform(1);}@Test@DisplayName("FizzBuzz::transform(1) should return 1")voidfizzBuzzTransform_given1_shouldReturn1(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(1);assertEquals("1",result);}@Test@DisplayName("FizzBuzz::transform(2) should return 2")voidfizzBuzzTransform_given2_shouldReturn2(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(2);assertEquals("2",result);}@Test@DisplayName("FizzBuzz::transform(3) should return Fizz")voidfizzBuzzTransform_given3_shouldReturnFizz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(3);assertEquals("Fizz",result);}@Test@DisplayName("FizzBuzz::transform(5) should return Buzz")voidfizzBuzzTransform_given5_shouldReturnBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(5);assertEquals("Buzz",result);}@Test@DisplayName("FizzBuzz::transform(6) should return Fizz")voidfizzBuzzTransform_given6_shouldReturnFizz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(6);assertEquals("Fizz",result);}@Test@DisplayName("FizzBuzz::transform(10) should return Buzz")voidfizzBuzzTransform_given10_shouldReturnBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(10);assertEquals("Buzz",result);}@Test@DisplayName("FizzBuzz::transform(15) should return FizzBuzz")voidfizzBuzzTransform_given15_shouldReturnFizzBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(15);assertEquals("FizzBuzz",result);}@Test@DisplayName("FizzBuzz::transform(30) should return FizzBuzz")voidfizzBuzzTransform_given30_shouldReturnFizzBuzz(){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(30);assertEquals("FizzBuzz",result);}}
FizzBuzzParametizedTest.java
packageud4.examples;importorg.junit.jupiter.api.DisplayName;importorg.junit.jupiter.api.Test;importorg.junit.jupiter.params.ParameterizedTest;importorg.junit.jupiter.params.provider.CsvSource;import staticorg.junit.jupiter.api.Assertions.assertEquals;publicclassFizzBuzzTest{@Test@DisplayName("FizzBuzz class should exist")voidfizzBuzzClassShouldExist(){FizzBuzzfizzBuzz=newFizzBuzz();}/* @Test @DisplayName("FizzBuzz::transform() method should exist") void fizzBuzzTransformMethodShouldExist(){ FizzBuzz fizzBuzz = new FizzBuzz(); fizzBuzz.transform(); } */@Test@DisplayName("FizzBuzz::transfrom() should have an int parameter")voidfizzBuzzTransformShouldHaveIntParameter(){FizzBuzzfizzBuzz=newFizzBuzz();fizzBuzz.transform(1);}@ParameterizedTest(name="FizzBuzz::transform({0}) should return {1}")@DisplayName("FizzBuzz::transform()")@CsvSource({"1, 1","2, 2","3, Fizz","5, Buzz","6, Fizz","10, Buzz","15, FizzBuzz","30, FizzBuzz"})voidfizzBuzzTransform(intinput,Stringexpected){FizzBuzzfizzBuzz=newFizzBuzz();Stringresult=fizzBuzz.transform(input);assertEquals(expected,result);}}