2016-10-10 5 views
0

Ich habe eine jUnit-Klasse, die eine Klasse erweitert, deren geschützte Methoden ich testen muss.Instanziieren jUnit Test Klasse

@RunWith(...) 
@Configuration(...) 
public class testA extends A{ 
    @Test 
    public void testProtectedMethod1(){ 
    .. 
    } 
} 

Nun muss die Klasse A eine bestimmte Variable (ein DAO), während Instanziierung eingestellt werden. Das Ausführen dieses Codes löst IllegalArgumentException aus - DAO muss bereitgestellt werden.

Dinge, die ich habe versucht:

1) manuell die Verwendung von DAO @Before Einstellung - nicht

funktioniert hat

2) Angeben einer Bohne für die Testklasse mit DAO-Eigenschaft festgelegt - hat nicht funktioniert.

Wie kann ich diese jUnit-Klasse mit einer geerbten Eigenschaft instanziieren?

+0

Wie erhält die Klasse A das DAO? Ist es ein Konstruktorparameter? –

+0

Klasse A erweitert eine andere Klasse B, die diese DAO-Variable hat. Klasse A hat keinen Konstruktor. Wir setzen das DAO in der Bean-Definition der Klasse A. mit p: DAO ... – user2780757

+0

Warum markieren Sie Ihre DAO-Klasse nicht als Spring-Bean, und verwenden Sie '@ Autowired', um es dorthin zu injizieren, wo Sie es brauchen? –

Antwort

0

Es stellt sich heraus, dass ich keine Eigenschaft einer jUnit-Testklasse injizieren kann, weil ihr Objekt von der jUnit-Laufzeit selbst instanziiert wird. Jedenfalls habe ich am Ende Reflektionen benutzt, um die privaten Methoden zu testen.

0

Ihr Klasse im Test sollte wahrscheinlich nicht einer sein, von dem Sie in Ihrer Unit-Testklasse erben. Außerdem ist das Testen von privaten Methoden von Natur aus schwierig (wenn nicht unmöglich), weil JUnit (und tatsächlich Java) so konzipiert sind.

Der ganze Sinn der Verwendung einer Einheit Tests und T-D-D ist es, in der Lage zu sein, die öffentlichen Methoden Ihrer Klasse zu testen. Wenn Sie versuchen, eine private Methode zu testen, möchten Sie wahrscheinlich zuerst Ihr (funktionales) Klassendesign überdenken. Folgt es der Single Responsibility Principle?

Wenn Sie eine Ausnahme von der allgemeinen Regel machen möchten, dass wir nur öffentliche Methoden testen, können Sie Ihre private Methode schützen oder den Zugriff packen (und sicherstellen, dass Ihre Testklasse den gleichen Paketnamen wie die zu testende Klasse hat).

In beiden Fällen ist es in JUnit eine schlechte Übung, dass Ihre Testklasse von der zu testenden Klasse übernommen wird, und Sie sollten dies vermeiden.

+0

Es stellt sich heraus, dass ich keine Eigenschaft einer jUnit-Testklasse injizieren kann, weil das Objekt von der jUnit-Laufzeit selbst instanziiert wird. Jedenfalls habe ich am Ende Reflektionen benutzt, um die privaten Methoden zu testen. Vielen Dank! – user2780757