# Testcases mit Junit auf private-Methode



## Gästin (30. Mai 2011)

Hallo,

ich weiß, private-Methoden testen zu wollen ist schlechter Stil, aber dummerweise kann/darf ich die Methode nicht mehr zu public machen, muss sie aber testen. 

Ich habe zwar z.B. Appendix A: Security and Permissions zum Thema gefunden, stehe aber (mal wieder) auf der Leitung, sprich kann es nicht anwenden. Ich arbeite im Übrigen mit Eclipse und Junit 4

Also meine Methode  in der Klasse MyClass ist 

```
public static int myMethod(int a) { ...}
```

mein Testcase sieht im Prinzip bisher wie folgt aus 


```
import org.junit.*;

public class thisIsMyTest {
	@Test(timeout = 1000) 
          public void testmyMethod() {
		Assert.assertEquals("Falsche Berechnung" , 42, MyClass.myMethod(23));
	  }
```

Wie krieg ich jetzt meinen Testcase dazu, auf die private Methode myMethod zuzugreifen?


----------



## gman (30. Mai 2011)

> Wie krieg ich jetzt meinen Testcase dazu, auf die private Methode myMethod zuzugreifen?



Welche private Methode? Die einzige Methode aus deinem Post ist public static. Du könntest eventuell die
Sichtbarkeit der private-Methode auf protected ändern und den Testcase im selben Package (aber NICHT
im selben Ordner) anlegen. Ist zwar auch nicht super toll, aber vielleicht hilfts dir ja weiter.


----------



## Gästin (30. Mai 2011)

gman hat gesagt.:


> Welche private Methode? Die einzige Methode aus deinem Post ist public static. Du könntest eventuell die
> Sichtbarkeit der private-Methode auf protected ändern und den Testcase im selben Package (aber NICHT
> im selben Ordner) anlegen. Ist zwar auch nicht super toll, aber vielleicht hilfts dir ja weiter.



Mist, copy-paste-Fehler. Ich habe für mich selbst die Methode public gemacht, und glatt diese kopiert... 
Es muss heißen 

```
private static int myMethod(int a) { ...}
```

Problem ist, ich darf an die Klasse, in der sich die private-Methode befindet, in *keinem Fall* etwas ändern... Hm. Package wäre eine Möglichkeit, wenn ich nur wieder an die Original-Klasse dürfte...


----------



## eRaaaa (30. Mai 2011)

Wie du schon sagtest, macht`s nicht viel Sinn, aber wenn du oben dich nur verschrieben hast und die Methodensignatur verkehrt ist und du 
	
	
	
	





```
private
```
 meintest, könntest du dir mit Reflection Abhilfe schaffen...aber naja


----------



## Gästin (30. Mai 2011)

eRaaaa hat gesagt.:


> Wie du schon sagtest, macht`s nicht viel Sinn, aber wenn du oben dich nur verschrieben hast und die Methodensignatur verkehrt ist und du
> 
> 
> 
> ...



klingt interessant... Kannst du mir mehr dazu schreiben?


----------



## eRaaaa (30. Mai 2011)

```
import java.lang.reflect.Method;
import junit.framework.Assert;
import org.junit.Test;

public class thisIsMyTest { //umbenennen hier :D

	@Test(timeout = 1000)
	public void testmyMethod() {
		try {
			Method m = MyClass.class.getDeclaredMethod("myMethod", int.class);
			m.setAccessible(true);
			Assert.assertEquals("Falsche Berechnung", 42, m.invoke(null, 23));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
```


----------



## Gästin (30. Mai 2011)

Super! Danke! Das müsste klappen ... danke schön!


----------



## fastjack (31. Mai 2011)

Warum willst Du eigentlich eine private Methode testen?


----------

