2016-05-25 6 views
0

Ich habe eine Schnittstelle, die einen Vertrag definiert (d. H. Eine Repository), mit wenigen Implementierungen. Jede Methode in der Schnittstelle stellt ein Feature dar, und ich möchte jedes Feature in seiner Suite-Testklasse testen.JUnit Contract Testing mit Suites

Lassen Sie uns eine UserRepository Schnittstelle übernehmen wie folgt:

public interface UserRepository { 

    Set<User> search(String query); 

    Set<User> findBySomethingSpecific(String criteria1, Integer criteria2); 
} 

Im Moment, um sicherzustellen, ich die gleichen Testfälle laufen, ich erstellen eine abstrakte Test-Klasse, und jede meiner Implementierungen eine Testklasse, die sich die abstrakte Testklasse.

public abstract UserRepositoryTest { 

    private UserRepository userRepository; 

    @Before 
    public void setUp() { 
     userRepository = createUserRepository(); 
    } 

    @Test public void aTestForSearch() { ... } 
    @Test public void anotherTestForSearch() { ... } 

    @Test public void aTestForSomethingSpecific() { ... } 
    @Test public void anotherTestForSomethingSpecific() { ... } 

    protected abstract UserRepository createUserRepository(); 
} 

//------------------------ 

public class UserRepositoryImplementationTest extends UserRepositoryTest { 

    @Override 
    protected UserRepository createUserRepository() { 
     return new UserRepositoryImplementation(); 
    } 
} 

Ich möchte einen Weg finden, diese abstrakte Testklasse in eine Reihe von kleinen Tests zu unterteilen, weil die Testklasse schnell überwältigt wird. Ich habe Test-Suites angeschaut, aber ich verstehe nicht, wie ich eine Suite-Test-Klasse erstellen kann, indem ich meine verschiedenen Implementierungen einfüge.

Als eine Seite nicht, habe ich diese question gefunden, aber einige meiner Repositorys erfordern einige Logik bei der Erstellung (z. B. ConnectionPool für eine SQL-Implementierung). Ich verwende derzeit das Anti-Muster ServiceLocator mit verschiedenen Context Klassen, um die Erstellung zu behandeln, aber das ist static. Aus diesem Grund hatte ich einen Ansatz für eine Testklasse durch Implementierung, so dass ich den Kontext erstellen und anschließend einfügen kann.

Antwort

0

Whit Junit 4 können Sie eine Suite, wie diese erstellen:

import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    TestFeatureLogin.class, 
    TestFeatureLogout.class, 
    TestFeatureNavigate.class, 
    TestFeatureUpdate.class 
}) 

/** 
* 
* This suite will execute TestFeatureLogin,TestFeatureLogout,TestFeatureNavigate and TestFeatureUpdate one after the over. 
* 
* @Before, @After and @Test are no possible of executing in this class. 
* @BeforeClas and @AfterClass are allowed only. 
* 
* */ 
public class FeatureTestSuite { 
    // the class remains empty of test,although it is possible set up a before class and after class annotations. 
    // used only as a holder for the above annotations 

    @BeforeClass 
    static public void beforeClass(){ 
     System.out.println(FeatureTestSuite.class.toString() + " BeforeClass Method"); 
    } 

    @AfterClass 
    static public void AfterClass(){ 
     System.out.println(FeatureTestSuite.class.toString() + " AfterClass Method"); 
    } 
} 

Das komplette Beispiel here

Eine andere Sache, die Sie berücksichtigen haben müssen gefunden werden könnte, ist, dass @Test nicht ist eine gute Praxis der Unit-Tests innerhalb der abstrakten Klasse. Wenn Sie Ihre Implementierungen testen möchten, erstellen Sie Testklassen, die sich auf die Klasse Abstract erstrecken.

+0

Wie injiziert 'FeatureTestSuite' Abhängigkeiten zu allen zugehörigen Klassen? – MiniW

+0

@MiniW Eine andere Option ist die Verwendung von Junit-Regeln http://StackOverflow.com/a/13489506/1371064 und JUnit-Parameter. Offensichtlich hängt das von der Art des Tests ab, den Sie testen möchten. In meinem Fall verwende ich immer Spring und innject Abhängigkeiten mit seinem Kontext. Hier ein Beispiel wie http://stackoverflow.com/a/14946430/1371064 –