JUnit - Dependências entre testes

Atualmente estou desenvolvendo uma classe que permite a alocação e desalocação de recursos de um determinado sistema.

Para testar o método que realiza a alocação, eu precisaria ao seu final desalocar os recursos, para que isto não interfira no restante dos testes.

O problema se encontra aí, pois para testar a alocação eu precisaria antes testar a desalocação, contudo para testar a desalocação eu precisaria antes testar a alocação, ou seja a velha história “quem nasceu primeiro, o ovo ou a galinha?”.

Uma solução seria testar os dois métodos em um único teste, contudo isto fere a filosofia dos testes unitários, e esta é uma situação que me deixa muito desconfortável.

O que devo fazer? O JUnit oferece uma solução plausível para isto?

Não entendi bem essa explicação, mas está me parecendo que você está querendo dizer (fazendo uma analogia): para testar a inclusão eu precisaria antes testar a exclusão, contuto para testar a exclusão eu precisaria antes testar a inclusão, … :?:

Sem conhecer direito o que exatamente você está testando fica superficial o que eu vou falar, mas vou tentar. Acho que esse recurso deveria ser um mock, e você deveria criar um JUnit Test Suite que teria seus dois JUnit Test Case separados, um para alocação e outro para desalocação.

ASOBrasil

Usando o setUp e o tearDown você não consegue deixar o sistema sempre no estado que você deseja?

e se precisar sempre do BD em estado testavel DBUnit.

[]'s

algo assim nao poderia ser feito ? usar varios asserts dentro do mesmo teste ?


import junit.framework.TestCase;
public class Blah extends TestCase {

   public void testAllocBlah() {
      TmpObj obj = new TmpObj({$param});

	  assertTrue(obj.getClass().isInstance(TmpObj)); 
	  assertEquals(obj.getParam(), "blah");
	  ... {desaloca }
	  assertNull(obj);
   }
}

ASOBrasil, a sua analogia está correta.

fmeyer, testar as duas ações em um mesmo método de teste é possível, e inclusive é o que estou fazendo até o presente momento. Não acho o ideal, pois fere um pouco os princípios dos testes unitários.

Contudo, andei pesquisando sobre o assunto, e quando se trata de orientação a objetos, estes príncipios se modificam um pouco, devido a natureza deste modelo de desenvolvimento. Isto pode ser observado no livro do Pressman, que dedica um tópico a testes unitários aplicados a sistemas OO.

Vou detalhar melhor o meu caso e talvez isto torne as coisas mais fáceis!

Quando digo alocar um recurso, na verdade estou dizendo alocar um recurso de hardware, mais especificamente um cartão do tipo Smart Card. Quando realizo uma conexão com o cartão (alocar recurso) eu devo de forma explicita fechar esta conexão quando não mais o utilizar (desalocar o recurso). O estabelecimento da conexão me retorna uma referência pela qual eu realizo o fechamento da mesma. Como o JUnit cria uma instância da classe de teste para cada método de teste, eu acabo por perder esta referência e não consigo desta forma fechar a conexão, e o cartão fica bloqueado não sendo mais possível utilizá-lo no restante dos testes.

Álguem sabe como resolver este impasse?

Olha não sei se estou meio perdido mais, usa o setUp para abrir a conexão e o tearDown pra fechar, pois como o s4nchez disse vc não consegue deixar o programa no estado que necessita usando teardown e setup…

[]'s

[quote=Henrique Mota Esteves]O estabelecimento da conexão me retorna uma referência pela qual eu realizo o fechamento da mesma. Como o JUnit cria uma instância da classe de teste para cada método de teste, eu acabo por perder esta referência e não consigo desta forma fechar a conexão, e o cartão fica bloqueado não sendo mais possível utilizá-lo no restante dos testes.

Álguem sabe como resolver este impasse?[/quote]

Cara um gatilho! O que vc pode fazer é criar um mock que transforme sua conexão em singleton.