2010-01-26 10 views
5

J'utilise JUnit 3 et j'ai une situation où souvent je dois tester qu'un objet est créé correctement. Mon idée était d'écrire une classe MyTestBase comme montré ci-dessous et ensuite étendre de celle pour les tests unitaires de situation-spécifiques.JUnit étendre la classe de base et avoir des tests dans cette classe en cours d'exécution

Toutefois, dans l'exemple que j'ai donné, MyTests ne lance pas les tests dans MyTestBase.

public class MyTestBase extends TestCase { 
    protected String foo; 
    public void testFooNotNull() { 
    assertNotNull(foo); 
    } 
    public void testFooValue() { 
    assertEquals("bar", foo); 
    } 
} 


public class MyTests extends MyTestBase { 
    public void setUp() { 
    this.foo = "bar"; 
    } 
    public void testSomethingElse() { 
    assertTrue(true); 
    } 
} 

Qu'est-ce que je fais mal?

Mise à jour Excuses. Erreur stupide. Les tests dans ma classe de base n'ont pas été nommés correctement.

+0

pourquoi ne pas utiliser junit 4? – Bozho

+1

Parce que le système est écrit en Java 1.4.2 –

+0

J'ai voté pour fermer la question parce que c'est juste faux. Cela ne pose pas de vraie question. –

Répondre

4

Vous avez dit "MyTests n'exécute pas les tests dans MyTestBase.". Je l'ai essayé et tous les tests ont été appelés, y compris ceux de MyTestBase.

+0

avez-vous essayé avec JUnit 3? – Bozho

+0

Oui, je l'ai essayé à partir d'Eclipse avec JUnit 3. J'ai exécuté la classe MyTests en tant que test JUnit et tous les tests réussis. –

+0

bien. alors la question n'est pas pertinente :) – Bozho

2

Eh bien, vous pouvez faire MyTestBase abstrait, de sorte qu'il n'a pas essayé d'exécuter des tests dans la classe de base. Une meilleure solution serait d'avoir setUp dans la classe de base et de lui faire appeler des méthodes abstraites (par exemple getFoo()) pour initialiser les variables dont il aura besoin plus tard. En fait, si vous avez ces méthodes abstraites, vous pouvez trouver que vous n'avez même pas besoin d'une phase de configuration en premier lieu - vous pouvez appeler les méthodes abstraites où vous avez besoin de la valeur, au lieu d'utiliser une variable d'instance . Évidemment, cela dépendra de la situation exacte, mais dans de nombreux cas, cela pourrait être beaucoup plus propre.

0

Ce que vous essayez de faire est de ne pas la façon la plus appropriée pour atteindre votre objectif:

Si vous voulez avoir des fonctionnalités communes qui fait des contrôles

  • définir dans une classe utilitaire, static méthodes
  • définissent dans la superclasse et l'appeler de chaque méthode d'essai
0

Je ne sais pas ce que vous voulez faire exactement, mais u En fait, ce n'est pas une très bonne idée d'avoir trop de parties communes en test, parce que quand la partie commune échoue, vous aurez un grand nombre de tests qui échouent, même si vous avez probablement un petit bug dans votre logiciel.

Je vous suggère d'utiliser une fabrique ou un constructeur pour créer l'objet complexe, puis de tester Factory (ou Builder) pour créer l'objet correctement.