Die Mathe-Redaktion - 24.11.2017 21:34 - Registrieren/Login
Auswahl
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden oder den Newsletter bestellen.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 508 Gäste und 23 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Java: Hamcrast Matcher Vorbedingung
Druckversion
Druckversion
Autor
Universität/Hochschule J Java: Hamcrast Matcher Vorbedingung
Chris311
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 23.01.2008
Mitteilungen: 6599
Aus: Karlsruhe
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2013-07-15


Hallo,


ich schreibe ein kleines Programm das mir Zahlen in ihre römische Darstellung umwandelt. Dabei gehe ich mit TDD vor.

Ich habe bereits meine Testklasse
Java
  1. import static org.hamcrest.CoreMatchers.is;
  2. import static org.junit.Assert.assertThat;
  3.  
  4. import org.junit.Test;
  5.  
  6. public class TestRoemischeZahlen {
  7.  
  8. @Test
  9. public void testeKonvertierenVon1ZuI() {
  10. assertThat(RoemischeZahl.zu(1), is("I"));
  11. }
  12.  
  13. @Test
  14. public void testeKonvertierenVon2ZuII() {
  15. assertThat(RoemischeZahl.zu(2), is("II"));
  16. }
  17. }

und meinen Produktivcode:
Java
  1. public class RoemischeZahl {
  2.  
  3. private static String roemischeZahl;
  4.  
  5. public static String zu(int zahlwert) {
  6. roemischeZahl = "";
  7.  
  8. for (int counter = 1; counter <= zahlwert; counter++)
  9. roemischeZahl += "I";
  10.  
  11. return roemischeZahl;
  12. }
  13. }


Meine Frage lautet nun, ob ich nicht eine Möglichkeit habe, die Test unabhängig voneinander zu gestalten. Sprich, wenn man Zeile 6 des Produktivcodes weglässt, bekommt man eine Fehlermeldung. Ich habe schon von Annotationen wie @Before oder @Rule gehört, weiß allerdings gerade nicht wie ich diese hier anwenden kann.

Ich würde mich sehr über Eure Hilfe freuen.

Liebe Grüße
Chris



-----------------
Ich höre, und vergesse.
Ich sehe, und erinnere.
Ich handle, und verstehe.
Konfuzius



  Profil  Quote  Link auf diesen Beitrag Link
Wrathchild
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 09.01.2007
Mitteilungen: 774
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2013-07-16


Das statische Feld roemischeZahl ist überflüssig und sollte durch eine lokale Variable ersetzt werden. Zudem sollte für derartige Algorithmen aus Effizienzgründen ein StringBuilder verwendet werden. Und wenn man solche grundlegenden Dinge beachtet, tritt auch das "Problem" nicht mehr auf...
[ Nachricht wurde editiert von Wrathchild am 16.07.2013 00:30:37 ]



  Profil  Quote  Link auf diesen Beitrag Link
Chris311
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 23.01.2008
Mitteilungen: 6599
Aus: Karlsruhe
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2013-07-16


Hallo Wrathchild und danke für deine Antwort.

Ich habe deine Vorschläge berücksichtig und StringBuilder verwendet. Der Vorteil ist natürlich, dass diese mutable sind, was in diesem Kontext sinnvoller erscheint. Jedenfalls funktionieren meine Matcher dann nicht mehr. Ich wollte dann (vor allem auch als Übung) einen eigenen Matcher schreiben. Ich denke das hat auch soweit gut funktioniert, allerdings bekomme ich den gerade nicht importiert. Hier mal mein Zwischenergebnis:

TestCode (nicht kompilierbar):
Java
  1. import static org.hamcrest.CoreMatchers.is;
  2. import static org.junit.Assert.assertThat;
  3.  
  4. import org.junit.Test;
  5.  
  6. public class TestRoemischeZahlen {
  7.  
  8. @Test
  9. public void testeKonvertierenVon1ZuI() {
  10. assertThat(RoemischeZahl.zu(1), essentiallyEquals(new StringBuilder("I")));
  11. }
  12.  
  13. @Test
  14. public void testeKonvertierenVon2ZuII() {
  15. assertThat(RoemischeZahl.zu(2), is("II"));
  16. }
  17.  
  18. @Test
  19. public void testeKonvertierenVon3ZuIII() {
  20. assertThat(RoemischeZahl.zu(3), is("III"));
  21. }
  22.  
  23. @Test
  24. public void testeKonvertierenVon5ZuV() {
  25. assertThat(RoemischeZahl.zu(5), is("V"));
  26. }
  27.  
  28. @Test
  29. public void testeKonvertierenVon4ZuIV() {
  30. assertThat(RoemischeZahl.zu(4), is("IV"));
  31. }
  32. }

mein Produktivcode:
Java
  1. public class RoemischeZahl {
  2.  
  3. public static StringBuilder zu(int zahlwert) {
  4. StringBuilder roemischeZahl = new StringBuilder();
  5.  
  6. if (zahlwert <= 3) {
  7. for (int counter = 1; counter <= zahlwert; counter++)
  8. roemischeZahl.append("I");
  9.  
  10. return roemischeZahl;
  11. }
  12.  
  13. if (zahlwert == 4) {
  14. return roemischeZahl.append("IV");
  15. }
  16.  
  17. if (zahlwert >= 5) {
  18. return roemischeZahl.append("V");
  19. }
  20.  
  21. return null;
  22. }
  23. }

und mein Matcher:
Java
  1. import org.hamcrest.Description;
  2. import org.hamcrest.Factory;
  3.  
  4. public class VergleicheStringBuilder extends org.hamcrest.BaseMatcher<StringBuilder> {
  5.  
  6. private static StringBuilder actual;
  7.  
  8. public VergleicheStringBuilder(StringBuilder actual) {
  9. this.actual = actual;
  10. }
  11.  
  12. public boolean matches(Object expected) {
  13. return actual.equals(expected);
  14. }
  15.  
  16. public void describeTo(Description description) {
  17. // TODO Auto-generated method stub
  18.  
  19. }
  20.  
  21. @Factory
  22. public static VergleicheStringBuilder essentiallyEquals(StringBuilder actual) {
  23. return new VergleicheStringBuilder(actual);
  24. }
  25.  
  26. }


Hast du eine Ahnung (du kannst es natürlich nicht wirklich wissen) wie ich den import organisieren kann, sodass ich meinen Matcher in meiner Testklasse verwenden kann?

Zur Information:
Ich habe zwei source-Folder: src und test
in src ist mein Produktivcode
in test sind die beiden anderen Klassen

Seltsamerweise wurden die Klassen nochmal in sog. "default packages" gepackt (vermutlich weil ich keinen Namen angegeben habe). Das ganze ist unter einem Java-Projekt unter Dach und Fach.

Ich würde mich sehr über deine Antwort freuen.

Liebe Grüße
Chris

[ Nachricht wurde editiert von Chris311 am 16.07.2013 19:32:42 ]


-----------------
Ich höre, und vergesse.
Ich sehe, und erinnere.
Ich handle, und verstehe.
Konfuzius



  Profil  Quote  Link auf diesen Beitrag Link
Wrathchild
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 09.01.2007
Mitteilungen: 774
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2013-07-17


Eigentlich war es so gedacht, dass Du den StringBuilder nur lokal in der Methode verwendest und das Ergebnis dann als String zurücklieferst. Ist aber jetzt auch egal.

Offensichtlich ist, dass in deinem Testcode eine Zeile wie import static VergleicheStringBuilder.essentiallyEquals; fehlt. Ob das reicht, um den Fehler zu beheben, ist schwer zu sagen, da Du wieder einmal die Fehlermeldungen nicht angegeben hast...



  Profil  Quote  Link auf diesen Beitrag Link
Chris311
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 23.01.2008
Mitteilungen: 6599
Aus: Karlsruhe
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2013-07-21


Ok, das lag an der package-Struktur. Anscheinend gibt's Probleme bei Verwendung von default-packages.

Allerdings schlagen meine Tests nun fehl. Beispielsweise direkt der erste:
Java
@Test
public void testeKonvertierenVon1ZuI() {
 assertThat(RoemischeZahl.zu(1), essentiallyEquals(new StringBuilder("I")));
}

Da bekomme ich einen AssertionError:
Expected:
but was:

Was schhlägt hier fehl? Warum steht da bei expected nichts?

Liebe Grüße
Chris



-----------------
Ich höre, und vergesse.
Ich sehe, und erinnere.
Ich handle, und verstehe.
Konfuzius



  Profil  Quote  Link auf diesen Beitrag Link
Chris311
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 23.01.2008
Mitteilungen: 6599
Aus: Karlsruhe
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2013-08-21


Ok, man musste die describeTo-Methode noch befüllen.


Indessen wundere ich mich über eine ganz andere Fehlermeldung:
Java
package romischeZahlTest;
 
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static romischeZahlTest.VergleicheStringBuilder.essentiallyEquals;
 
import org.junit.Ignore;
import org.junit.Test;
 
import romischeZahl.RoemischeZahl;
 
public class RoemischeZahlenTest {
 
	@Test
	public void testeKonvertierenVon1ZuI() {
		assertEquals(RoemischeZahl.zu(1), new StringBuilder("I"));
        }
}


Der Test ist rot, mit der Meldung:
java.lang.AssertionError; expected: java.lang.StringBuilder but was: java.lang.StringBuilder

Das ist doch ein Scherz oder?

Liebe Grüße
Chris



-----------------
Ich höre, und vergesse.
Ich sehe, und erinnere.
Ich handle, und verstehe.
Konfuzius



  Profil  Quote  Link auf diesen Beitrag Link
Chris311
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 23.01.2008
Mitteilungen: 6599
Aus: Karlsruhe
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2017-10-30 20:34


Nach gut 4 Jahren in der Softwareentwicklung muss ich einsehen, was ich hier damals für einen Quatsch geschrieben habe. Die Posts sind total überflüssig und unsauber. Hab ich das wirklich geschrieben? Wie man hier sauber testet ist mir mittlerweile glasklar und ich sehe hier auch keine Probleme. Ich erledige das Thema somit (gerne kann es auch gelöscht werden).


-----------------
Ich höre, und vergesse.
Ich sehe, und erinnere.
Ich handle, und verstehe.
Konfuzius



  Profil  Quote  Link auf diesen Beitrag Link
Chris311 hat die Antworten auf ihre/seine Frage gesehen.
Chris311 hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2017 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]