Sou novo com testes automatizados.
Vou apresentar um caso de exemplo parecido com o que tenho aqui:
Preciso testar um ObjetoX que tem um Construtor que recebe um IComponenteX, assim:
public class ObjetoX {
public ObjectoX(IComponenteX cx) {...}
public int metodoA() {...}
public void metodoB(int i) {...}
}
O IComponenteX é uma interface que até agora possui duas implementações, CompX1 e CompX2.
Quero escrever um Teste que irá testar os métodos de ObjetoX instanciando-o como new ObjetoX(new CompX1());, e depois quero testar os métodos do ObjetoX instanciando-o como new ObjetoX(new CompX2());.
Criei uma Classe de Teste assim:
public Teste_ObjetoX {
private ObjetoX objX;
@Before public void setUp() {objX = new ObjetoX(new CompX1());} //roda antes de cada Teste
@Test public void testMetodoA() {...}
@Test public void testMetodoB() {...}
}
Com a Classe de Teste acima consigo testar a implementação "new ObjetoX(new CompX1());", mas, ainda não consigo testar a implementação "new ObjetoX(new CompX2());".
Eu poderia fazer uma cópia da Classe de Teste e mudar apenas a implementação do método setUp(), mas isso criaria muito código repetido. Talvez eu devesse extender então essa classe de Teste e sobrescrever o método setUp(), mas será que isso é uma boa ideia?:
Por enquanto, os métodos testMetodoA() e testMetodoB() podem ser os mesmos para testar o ObjetoX construído com CompX1 ou com CompX2, porque os resultados esperados são os mesmos. Talvez isso mude no futuro.
Então, como faço? Como vocês fazem?