Pessoal,
Estou estudando TDD a comecei a aplicar no meu trabalho. Mas não tenho certeza se realmente estou fazendo da forma correta e se meu código realmente está com baixo acoplamento. Por isso gostaria de opinião de vocês. Tenho uma classe chamada processo que tem o método getJuros:
public Double getJuros(Calendar dataBase, CalculadorDeJuros calculadorDeJuros, CalculadorDeDiferencaDeMesesEntreDatas calculadorDeDiferencaDeMeses) throws IllegalArgumentException {
Double juros = 0.0;
try {
int mesesEmAtraso = calculadorDeDiferencaDeMeses.calcular(this.getDataDaPropositura(), dataBase);
juros = calculadorDeJuros.calcular(this.getPorcentagemDeJuros(), mesesEmAtraso, this.getValorDaCausa());
}catch(NullPointerException ex){
throw new IllegalArgumentException("Não foi possível calcular o juros, falta parâmetros para o método");
}
return juros;
}
E pra esse método, desenvolvi os seguintes casos de teste usando JUnit:
@Test
public void testGetJuros() throws Exception {
Calendar dataDaPropositura = Calendar.getInstance();
dataDaPropositura.set(2012, 6, 10);
Calendar dataBase = Calendar.getInstance();
dataBase.set(2012, 8, 1);
Processo instance = new Processo();
instance.setValorDaCausa(200.0);
instance.setDataDaPropositura(dataDaPropositura);
instance.setPorcentagemDeJuros(1.0);
CalculadorDeJuros calculadorDeJurosMocked = mock(CalculadorDeJuros.class);
when(calculadorDeJurosMocked.calcular(1.0, 1, 200.0)).thenReturn(2.0);
CalculadorDeDiferencaDeMesesEntreDatas calculadorDeDiferencaDeMesesMocked = mock(CalculadorDeDiferencaDeMesesEntreDatas.class);
when(calculadorDeDiferencaDeMesesMocked.calcular(dataDaPropositura, dataBase)).thenReturn(1);
Double expectedResult = 2.0;
Double result = instance.getJuros(dataBase, calculadorDeJurosMocked, calculadorDeDiferencaDeMesesMocked);
assertEquals(expectedResult, result);
}
@Test(expected=IllegalArgumentException.class)
public void testGetJurosSemCalculadorDeJuros() throws Exception {
Calendar dataDaPropositura = Calendar.getInstance();
dataDaPropositura.set(2012, 6, 10);
Calendar dataBase = Calendar.getInstance();
dataBase.set(2012, 8, 1);
Processo instance = new Processo();
instance.setValorDaCausa(200.0);
instance.setDataDaPropositura(dataDaPropositura);
instance.setPorcentagemDeJuros(1.0);
CalculadorDeDiferencaDeMesesEntreDatas calculadorDeDiferencaDeMesesMocked = mock(CalculadorDeDiferencaDeMesesEntreDatas.class);
when(calculadorDeDiferencaDeMesesMocked.calcular(dataDaPropositura, dataBase)).thenReturn(1);
Double result = instance.getJuros(dataBase, null, calculadorDeDiferencaDeMesesMocked);
}
@Test(expected=IllegalArgumentException.class)
public void testGetJurosSemCalculadorDeDiferencaDeMeses() throws Exception {
Calendar dataDaPropositura = Calendar.getInstance();
dataDaPropositura.set(2012, 6, 10);
Calendar dataBase = Calendar.getInstance();
dataBase.set(2012, 8, 1);
Processo instance = new Processo();
instance.setValorDaCausa(200.0);
instance.setDataDaPropositura(dataDaPropositura);
instance.setPorcentagemDeJuros(1.0);
CalculadorDeJuros calculadorDeJurosMocked = mock(CalculadorDeJuros.class);
when(calculadorDeJurosMocked.calcular(1.0, 1, 200.0)).thenReturn(2.0);
Double result = instance.getJuros(dataBase, calculadorDeJurosMocked, null);
}
@Test(expected=IllegalArgumentException.class)
public void testGetJurosSemDataBase() throws Exception {
Calendar dataDaPropositura = Calendar.getInstance();
dataDaPropositura.set(2012, 6, 10);
Processo instance = new Processo();
instance.setValorDaCausa(200.0);
instance.setDataDaPropositura(dataDaPropositura);
instance.setPorcentagemDeJuros(1.0);
CalculadorDeJuros calculadorDeJurosMocked = mock(CalculadorDeJuros.class);
when(calculadorDeJurosMocked.calcular(1.0, 1, 200.0)).thenReturn(2.0);
CalculadorDeDiferencaDeMesesEntreDatas calculadorDeDiferencaDeMesesMocked = mock(CalculadorDeDiferencaDeMesesEntreDatas.class);
when(calculadorDeDiferencaDeMesesMocked.calcular(dataDaPropositura, null)).thenThrow(IllegalArgumentException.class);
Double result = instance.getJuros(null, calculadorDeJurosMocked, calculadorDeDiferencaDeMesesMocked);
}
@Test(expected=IllegalArgumentException.class)
public void testGetJurosSemDataDaPropositura() throws Exception {
Calendar dataBase = Calendar.getInstance();
dataBase.set(2012, 8, 1);
Processo instance = new Processo();
instance.setValorDaCausa(200.0);
instance.setPorcentagemDeJuros(1.0);
CalculadorDeJuros calculadorDeJurosMocked = mock(CalculadorDeJuros.class);
when(calculadorDeJurosMocked.calcular(1.0, 1, 200.0)).thenReturn(2.0);
CalculadorDeDiferencaDeMesesEntreDatas calculadorDeDiferencaDeMesesMocked = mock(CalculadorDeDiferencaDeMesesEntreDatas.class);
when(calculadorDeDiferencaDeMesesMocked.calcular(null, dataBase)).thenThrow(IllegalArgumentException.class);
Double result = instance.getJuros(dataBase, calculadorDeJurosMocked, calculadorDeDiferencaDeMesesMocked);
}
Achei os testes um pouco complexos, sei que quando isso acontece é sinal de que meu código está com alto acoplamento e deveria pensar em refatorar. Mas realmente está complexo ou é só uma paranoia minha? O que acham?