2017-06-25 2 views
2

Je suis conscient qu'il y a une autre question dans ce forum qui PEUT sembler similaire. Veuillez lire attentivement avant de marquer comme doublon.Comment utiliser un test JUnit existant dans une autre classe de test, de telle sorte qu'il passe par @before?

Je cherche un moyen d'exécuter un test, qui est défini dans une autre classe, de telle sorte qu'il passe par l'annotation @before.

public TestClass1 { 
    @before 
    public void setup() throws Exception{ 
     super.setup(); 
    } 

    @Test 
    public void testSomething(){...} 
} 

public TestClass2 { 
    @Test 
    public void testSomethingAndSomethingElse() { 
     // Somehow execute testSomething() in a way which will force 
      it to go through the @before 
     // and then test something else 
     } 
} 

Dans la question en ligne similaire il y a 2 suggestions êtes les:
1. Prolonge TestClass2 de TestClass1 - ce qui est impossible pour moi depuis que je transmets une autre classe déjà.
2. Pour accéder TestClass1 de TestClass2 en utilisant la délégation, comme ceci:

// Instantiate TestClass1 as a member of TestClass2 
public TestClass2 { 
    private TestClass1 one = new TestClass1(); 
    public void testSomethingAndSomethingElse1() { 
     one.testSomething(); 
    } 
} 

Le problème ici est que lorsque vous appelez one.testSomething() - vous ne serez pas passer par l'annotation @Before de TestClass1, qui, à mon case est nécessaire pour initier d'autres objets.

Existe-t-il un autre moyen?

L'utilisation est pour les tests d'intégration et non pour les tests unitaires. J'ai besoin de la possibilité d'utiliser @test dans un autre @test, et pas n'importe quelle autre solution de contournement.

+0

'setup()' de 'TestClass2'? – c0der

+0

car le fichier setup() prépare les données pour le test @test dans TestClass1. Ces données seront hors de portée pour TestClass1 lorsqu'il est appelé à partir de TestClass2. –

+0

Les sous-classes 'TestClass1' et' TestClass2' de la même classe sont-elles? Si oui, envisagez de déplacer l'annotation '@ before 'vers leur super classe. – c0der

Répondre

1

Si vous essayez de réutiliser le même code dans de nombreuses classes de test, je suggère d'utiliser @Rule du cadre JUnit. Peut-être ExternalResource est ce que vous avez besoin:

public class SetupResource extends ExternalResource { 
    @Override 
     protected void before() throws Throwable { 
     //setup the code 
    } 
} 

Mettre le code que vous voulez dans la méthode before() puis définir JUnitRule comme ça:

@Rule 
public ExternalResource resource = new SetupResource() 
0

En supposant TestClass1 et TestClass2 sous-classe de la même classe envisager de se retirer la @before annotation à leur super classe:

public class TestCalss { 

    @Before 
    public void setUp() throws Exception { 
     System.out.println("setup"); 
    } 
} 

public class TestCalss1 extends TestCalss{} 
public class TestCalss2 extends TestCalss{}