EDIT: Początkowo nieco przesadziłem i niektóre rzeczy nad wyrost chciałem, zrobić w związku z czym nie wypełniałem konkretnych wymagań.
Hej.
Uczę się właśnie testów jednostkowych i TDD. To jest w sumie moje pierwsze podejście i nie wiem czy testy jednostkowe do końca z konwencją zgodnie są napisane. W sumie zależy mi na tym, aby porządnie było zrobione bo dostałem zadanko takie i będzie sprawdzane, w związku z czym nie wiem czy nie przesadziłem z testami.
Tutaj jest opis zadania gdyby ktoś potrzebował : http://osherove.com/tdd-kata-1/
W skrócie, napisać Kalkulator stringowy napisany z podejściem TDD.
Gdyby ktoś wolał link do GitHuba to na priv wyślę, bo oficjalne konto.
Do tej pory zrobiłem:
-Metoda przyjmuje stringa z dowolną ilością liczb. Liczby tylko całkowite.
-Sprawdza czy wprowadzone są w odpowiednim formacie (1,2,3,4) tylko i wyłącznie taki dozwolony i zwraca odpowiednie wyjątki.
-Sprawdza czy null i czy pusty string
Odnośnie samej metody, to wiem, że dużo ifów i spróbuję ją refactorować, żeby bardziej elegancka była, póki co miały testy przechodzić po prostu. Aczkolwiek uwagi odnośnie metody też bardzo chętnie przyjmę.
Klasa:
public class StringCalculator {
public int add(String string) {
if (string == null) throw new NullPointerException("String can't be null");
if (string.length() == 0) {
return 0;
}
if (!Pattern.matches("(\\d+){1}([,\\.]\\d+)*", string))
throw new IllegalArgumentException("Input have to be numeric type, separated by comma(,)");
if (Pattern.matches("\\d+", string)) {
int singleNum = Integer.parseInt(string);
return singleNum;
}
String[] arrayOfNumbers = string.split(",");
int sum = 0;
int parsedNumber;
for (String number : arrayOfNumbers) {
parsedNumber = Integer.parseInt(number);
sum += parsedNumber;
}
return sum;
}
}
Testy:
public class StringCalculatorTest {
StringCalculator stringCalculator;
@Before
public void setUp() throws Exception {
stringCalculator = new StringCalculator();
}
@Test
public void shouldReturn0WhenPassedStringIsEmpty() {
assertEquals("String is empty", 0, stringCalculator.add(""));
}
@Test(expected = NullPointerException.class)
public void shouldThrowNullPointerExceptionWhenPassedStringIsNull() {
stringCalculator.add(null);
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionWhenPassedStringIsNotANumber() {
stringCalculator.add("X");
stringCalculator.add("1,s,3");
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionWhenPassedStringHasCommaAsAFirstCharacter() {
stringCalculator.add(",1,2,3");
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionWhenPassedStringHasDuplicatedCommas() {
stringCalculator.add("1,,3");
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionWhenPassedStringHasCommaAsALastCharacter() {
stringCalculator.add("1,2,3,");
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionWhenPassedStringHasWhiteSpaces() {
stringCalculator.add("1,2, 3");
}
@Test
public void shouldReturnTheSameNumberWhenItWasOnlyNOneNumberPassed() {
assertEquals(3,stringCalculator.add("3"));
}
@Test
public void shouldReturnSumOfEveryAmountOfNumbersWhereAmountHaveToBeBiggerThanOne() {
assertEquals(3+2,stringCalculator.add("3,2"));
assertEquals(3+2+6+10,stringCalculator.add("3,2,6,10"));
assertEquals(3+2+6+10+100,stringCalculator.add("3,2,6,10,100"));
}
}