# Wie Junit mit Netbeans 8.1 verwenden ?



## ernst (4. Jul 2018)

Hallo allerseits
ich will etwas mit Tests in Java (Junit) experimentieren bzw. ausprobieren.
Habe deshalb das folgende syntaktische korrekte Java-Programm (in Netbeans 8.1) geschrieben, (ein Demoprogramm) das Junit verwendet (Compiler meldet keine Fehler).
Vorher habe ich junit-4.10.jar runtergeladen und in mein Projekt eingebunden:
Rechte Maustaste auf das aktuelle Projekt -->
Properties -->
Libraries -->
Add Jar/Folder -->
Die folgende Datei  junit-4.10.jar anklicken.

Frage:
wie kann man den Test starten bzw. wie nutzt man Junit am Besten ?
Habe schon gelesen, daß man ein Junit-Plugin einbinden kann.
Das geht bei mir nicht.

mfg
ernie




============================

```
package demo1junit;
import static org.junit.Assert.*;
import org.junit.Test;

public class Startklasse {

    public static void main(String[] args) {

    }
  
}

class StringUtilsTest
{
@Test
public void testReverse()
{
 assertEquals( "", StringUtils.reverse( "" ) );
 assertEquals( "cba", StringUtils.reverse( "abc" ) );
}
}

class StringUtils
{
 public static String reverse( String string )
 {
  return null;
 }
}
```


----------



## httpdigest (4. Jul 2018)

Funktionieren die Antworten hier nicht?
https://stackoverflow.com/questions/1381512/how-do-i-run-junit-from-netbeans


----------



## ernst (4. Jul 2018)

Danke für diese Infos.
Habe wie empfohlen mit Alt + F6 den Test gestartet (bzw. mit RM + Test)
Dann erschien die Ausgabe unten.
Müsste es bei
assertEquals( "cba", StringUtils.reverse( "abc" ) );
nicht eine Fehlermeldung bringen, da
StringUtils.reverse( "abc" )
null zurückgibt, aber im Test:
assertEquals( "cba", StringUtils.reverse( "abc" ) );
"abc"
erwartet wird ?


```
====================================
ant -f D:\\Daten_Austausch_1_7_18\\MEINE_SKRIPTE\\ProgJava\\28_Junit\\demo1Junit -Dnb.internal.action.name=test -Dignore.failing.tests=true -Dnb.wait.for.caches=true test
init:
deps-jar:
Updating property file: D:\Daten_Austausch_1_7_18\MEINE_SKRIPTE\ProgJava\28_Junit\demo1Junit\build\built-jar.properties
compile:
compile-test:
test-report:
test:
BUILD SUCCESSFUL (total time: 0 seconds)
====================================
```

mfg
ernie


----------



## httpdigest (4. Jul 2018)

ernst hat gesagt.:


> Müsste es bei assertEquals( "cba", StringUtils.reverse( "abc" ) ); nicht eine Fehlermeldung bringen, da StringUtils.reverse( "abc" ) null zurückgibt


Wieso sollte StringUtils.reverse() null zurückliefern und nicht eher tatsächlich den umgekehrten String??
Ob der Test richtig ausgeführt wird, kannst du ganz ganz einfach mit assertTrue(false); ausprobieren.


----------



## mihe7 (4. Jul 2018)

httpdigest hat gesagt.:


> Wieso sollte StringUtils.reverse() null zurückliefern





ernst hat gesagt.:


> class StringUtils
> {
> public static String reverse( String string )
> {
> ...


----------



## httpdigest (4. Jul 2018)

Bist du sicher, dass er tatsächlich in dem Test _dieses_ StringUtils verwendet, und nicht ein _anderes_? Schau mal in die Imports des Tests, ob da ein anderes StringUtils importiert wird.


----------



## httpdigest (4. Jul 2018)

Und generell ist es keine gute Idee, einen Unit Test zusammen mit anderen Klassen in derselben Compilation Unit (Quelldatei) zu haben, insbesondere da ja die Quelldatei so heißen muss, wie die einzige public class in der Datei, also bei dir Startklasse.java.
Ich denke mal, dass Netbeans den Test gar nicht identifiziert bekommt. In Eclipse funktioniert solch eine Konstellation (Test als package-protected Klasse zusammen mit der public Hauptklasse in einer Compilation Unit) übrigens auch nicht.
Separiere deine Testklasse als eigenständige Datei.


----------



## mihe7 (4. Jul 2018)

Ob und warum StringUtils nicht null zurückliefert, weiß ich nicht. Vielleicht nimmt er ein anderes her, vielleicht wird sein Test nicht ausgeführt. Klar ist nur die Erwartung, dass es null zurückliefern sollte, weil er es eben so programmiert hat


----------



## ernst (4. Jul 2018)

Deinem Einwand folgend habe ich einige Namen des Quellcode abgändert:


```
package demo1junit;
import static org.junit.Assert.*;
import org.junit.Test;

public class Startklasse {
    public static void main(String[] args) {
    }
}

class MeinTest{
  @Test
  public void testReverse(){
    assertEquals( "", MeineStrings.reverse( "" ) );
    assertEquals( "cba", MeineStrings.reverse( "abc" ) );
  }
}

class MeineStrings{
  public static String reverse( String string ){
    return null;
  }
}
```

bekomme aber immer noch keinen Fehlermeldung:

```
ant -f D:\\Daten_Austausch_1_7_18\\MEINE_SKRIPTE\\ProgJava\\28_Junit\\demo1Junit -Dnb.internal.action.name=test -Dignore.failing.tests=true -Dnb.wait.for.caches=true test
init:
Deleting: D:\Daten_Austausch_1_7_18\MEINE_SKRIPTE\ProgJava\28_Junit\demo1Junit\build\built-jar.properties
deps-jar:
Updating property file: D:\Daten_Austausch_1_7_18\MEINE_SKRIPTE\ProgJava\28_Junit\demo1Junit\build\built-jar.properties
compile:
compile-test:
test-report:
test:
BUILD SUCCESSFUL (total time: 0 seconds)
```

mfg
ernie


----------



## mihe7 (4. Jul 2018)

Der Code dürfte doch nicht einmal kompilieren: die Annotation heißt 
	
	
	
	





```
@Test
```
, nicht 
	
	
	
	





```
@test
```
 (außer, ich habe was verpasst )

EDIT: ah, liegt am Foreneditor -> User wird zugeordnet.

EDIT2: Gibt es hier irgendeinen Trick?


----------



## ernst (4. Jul 2018)

httpdigest hat gesagt.:


> ...
> Separiere deine Testklasse als eigenständige Datei.



Habe den folgenden Text:

```
class MeinTest {
    @Test
    public void testReverse() {
        assertEquals("", MeineStrings.reverse(""));
        assertEquals("cba", MeineStrings.reverse("abc"));
    }
}
```

in eine eigene Datei separiert, so dass das package
demojunit
aus den 2 Dateien:
Startklasse.java
MeinTest.java
besteht.
Es gibt aber immer noch keine Fehlermeldung!

mfg
ernie


----------



## VfL_Freak (4. Jul 2018)

Nutze bitte die Code-Tags !!!
So bekommt man ja Augenkrebs 
VG Klaus


----------



## httpdigest (4. Jul 2018)

Du musst die Test-Klasse eventuell als public markieren.


----------



## ernst (4. Jul 2018)

httpdigest hat gesagt.:


> Du musst die Test-Klasse eventuell als public markieren.


Habe ich gemacht.
Es ändert sich aber nichts:

```
ant -f D:\\Daten_Austausch_1_7_18\\MEINE_SKRIPTE\\ProgJava\\28_Junit\\demo1Junit -Dnb.internal.action.name=test -Dignore.failing.tests=true -Dnb.wait.for.caches=true test
init:
deps-jar:
Updating property file: D:\Daten_Austausch_1_7_18\MEINE_SKRIPTE\ProgJava\28_Junit\demo1Junit\build\built-jar.properties
compile:
compile-test:
test-report:
test:
BUILD SUCCESSFUL (total time: 0 seconds)
```


----------



## mihe7 (4. Jul 2018)

In NetBeans JUnit zu verwenden, ist ja nun wirklich nicht das Problem. Du schreibst eine Klasse, die Du testen möchtest. Dann machst einen Rechtsklick auf der dazugehörigen Datei, im Kontextmenü wählst Du Tools -> Create Tests, wählst ggf. noch die JUnit-Version und das wars.

Wenn das Zeug einmal eingerichtet ist, kannst Du im Projektbaum in den Test-Quellen einfach weitere Testklassen hinzufügen (oder Du wendest obiges Verfahren an).

S. dazu auch https://netbeans.org/kb/docs/java/junit-intro.html


----------



## mrBrown (4. Jul 2018)

httpdigest hat gesagt.:


> Und generell ist es keine gute Idee, einen Unit Test zusammen mit anderen Klassen in derselben Compilation Unit (Quelldatei) zu haben, insbesondere da ja die Quelldatei so heißen muss, wie die einzige public class in der Datei, also bei dir Startklasse.java.


Zumindest bei TDD ist es durchaus normal, erstmal nur die Testklasse und in der sowohl Test als auch den zu testenden Code zu haben


----------



## mrBrown (4. Jul 2018)

mihe7 hat gesagt.:


> EDIT2: Gibt es hier irgendeinen Trick?


Wofür?
Das Annotations nicht als Nutzernamen erkannt werden? Code-Tags benutzen


----------



## mihe7 (4. Jul 2018)

@mrBrown ja. Dazwischen hatte ich es mit icode-Tags probiert, ging leider auch nicht. Und dann kam natürlich die Frage auf, ob man hier nichts Escapen kann


----------



## mrBrown (4. Jul 2018)

mihe7 hat gesagt.:


> @mrBrown ja. Dazwischen hatte ich es mit icode-Tags probiert, ging leider auch nicht. Und dann kam natürlich die Frage auf, ob man hier nichts Escapen kann


`[USER=58041]@mihe7[/USER]`

Merkwürdig, dachte das geht...

PLAIN scheint aber zu klappen:
@mihe7


----------



## ernst (4. Jul 2018)

mihe7 hat gesagt.:


> In NetBeans JUnit zu verwenden, ist ja nun wirklich nicht das Problem.
> Du schreibst eine Klasse, die Du testen möchtest. Dann machst einen Rechtsklick auf der dazugehörigen Datei, im Kontextmenü wählst Du Tools -> Create Tests, wählst ggf. noch die JUnit-Version und das wars.
> Wenn das Zeug einmal eingerichtet ist, kannst Du im Projektbaum in den Test-Quellen einfach weitere Testklassen hinzufügen (oder Du wendest obiges Verfahren an).
> S. dazu auch https://netbeans.org/kb/docs/java/junit-intro.html


Es ist für mich ein Problem!
1)
Mit
Tools -> Create Tests,
wird mir Software erstellt. Das will ich nicht.
Ich will meine eigenen Tests schreiben, wie in meinem kleinen Beispiel in meinem Posting.
Aber das funktioniert nicht.

2)
Ich will, dass die folgende Anweisung:
assertEquals("cba", MeineStrings.reverse("abc"));
einen Fehler produziert.
Das funktioniert aber nicht

3)
Was mache ich falsch ?

mfg
ernie


2)


----------



## mihe7 (4. Jul 2018)

ernst hat gesagt.:


> Tools -> Create Tests,
> wird mir Software erstellt. Das will ich nicht.


Damit soll auch nur sichergestellt werden, dass das Projekt korrekt eingerichtet wird. Die Testklasse, die hier erstellt wird, kannst Du hinterher löschen. Du kannst Deine eigenen Klassen schreiben, wie Du willst.


----------



## mrBrown (4. Jul 2018)

ernst hat gesagt.:


> 1)
> Mit
> Tools -> Create Tests,
> wird mir Software erstellt. Das will ich nicht.
> ...


Keine Ahnung was du mit "Software erstellt" meinst, aber Create Tests erzeugt nur den Klassen-Rahmen und richtet das Projekt entsprechend ein, die Tests musst du schon noch selber schreiben.


----------



## httpdigest (4. Jul 2018)

mrBrown hat gesagt.:


> Zumindest bei TDD ist es durchaus normal, erstmal nur die Testklasse und in der sowohl Test als auch den zu testenden Code zu haben


Ja, hast Recht. Meine Aussage war zu streng/scharf formuliert.  Des Toolings wegen sollte zumindest die Testklasse, wie du ja auch sagst, die public Klasse sein.


----------



## mrBrown (4. Jul 2018)

httpdigest hat gesagt.:


> Des Toolings wegen sollte zumindest die Testklasse, wie du ja auch sagst, die public Klasse sein.


Zumindest bis JUnit 4, da muss sie public sein. Ab JUnit 5 kann sie aber package-private sein, ist mMn gegenüber public zu bevorzugen.


----------



## ernst (4. Jul 2018)

mihe7 hat gesagt.:


> Damit soll auch nur sichergestellt werden, dass das Projekt korrekt eingerichtet wird. Die Testklasse, die hier erstellt wird, kannst Du hinterher löschen. Du kannst Deine eigenen Klassen schreiben, wie Du willst.


Habe den ganzen (alles) von Netbeans erzeugten Code gelöscht (so wie du es gesagt hast) und meinen Testcode reingeschrieben.
Dann erscheint u.a. die Meldung:
============================
...
Testsuite: demojunit10.MeinTestTest
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 sec
Null Test:    Caused an ERROR
...
=================================

mfg
ernie


----------



## mrBrown (4. Jul 2018)

Dein scheint doch alles richtig zu laufen


----------



## mihe7 (4. Jul 2018)

Warum nicht gleich so?


----------



## ernst (4. Jul 2018)

Vielen herzlichen Dank an alle.
Es hat jetzt geklappt.

mfg
ernie


----------



## Neumi5694 (19. Jul 2019)

ernst hat gesagt.:


> [...]Ich will meine eigenen Tests schreiben, [...]


Und was hält dich davon ab?

Hasst du denn schon mal geschaut, was der Menüpunkt eigentlich macht?
Er erstellt dir eine Beispielklasse mit eine paar Methoden, die im Grunde gar nichts machen, die sind nur dazu da, damit du was hast, nach dem du dich richten kannst, wie z.B. eine Methode, die vor allen Tests ausgeführt werden soll oder einer, die nach allen Tests ausgeführt werden soll.

In dieser Klasse schreibst du nun deine eigenen JUnit-Tests.
Diese sind public-Methoden ohne Parameter, davor schreibst du noch 
	
	
	
	





```
"@Test"
```
, damit sie auch ausgeführt werden.
Die Test-Klasse muss weder gleich heißen wie die zu testende Klasse (Netbeans nennd sie standardmäßig "KlassenNameIT"), noch muss sie im gleichen Package liegen. Letzteres ist aber zu empfehlen, wenn du package protected methoden testen willst.

Und wenn dir das immer noch nicht passt, dann leg halt deine eigene leere Klasse an und pack die Test-Methoden da rein.


----------

