Hash-Maps / ArrayLists testen

Status
Nicht offen für weitere Antworten.

mvitz

Top Contributor
Wie meinst du das?
Eigentlich kann man sich bei den Komponenten darauf verlassen, dass sie funktionieren.

Aber als Beispiel ginge das:
[HIGHLIGHT="Java"]import java.util.HashMap;

import static junit.framework.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestHashMap {

private static HashMap<Integer, String> theMap;

@BeforeClass
public static void beforeClass() {
theMap = new HashMap<Integer, String>();
}

@Test
public void testPut() {
theMap.put(1, "Test");
assertEquals("One element should be in the map.", 1, theMap.size());
assertEquals("The added element should be added.", "Test", theMap
.get(1));
}
}[/HIGHLIGHT]
 

Java-Problems

Bekanntes Mitglied
Ja ich habe das Problem dass ich eine Klasse Test habe und die Orginalklasse. Die Orginalklasse erzeugt allerdings im Konstruktor eine Hash-Map einer anderen Objektsorte (andere Klasse).
Damit ich nun aber den Test erfolgreich durchführen muss, benötige ich ja dann auch noch die Hash-Map.
Verstehst du mein Problem? Das ganze Projekt ist dermasen verschatelt, dass ich nicht nur eine Klasse für sich alleine testen kann. So ist aber die Aufgabenstellung, die es zu erfüllen gilt!
 

mvitz

Top Contributor
Quellcode der Klasse die du testen möchtest würde das ganze vereinfachen!

Vorher kann ich dir nichts genaueres sagen, evtl. musst du auch so genannte Mock Objekte bauen, dafür kann man z.B. Frameworks wie EasyMock oder JMock nutzen, aber ohne Code gesehen zu haben kann ich nichts genaues sagen, da ich nicht wirklich verstehe wo dein Problem ist.
 

Java-Problems

Bekanntes Mitglied
Code:
public class Recipe {

	private String name;
	public int neededIng;
	public int quantityNec;
	public String ingNa;
	private List<RecipeIngredient> recipeIngredient;

	public void createRecipeAskingUser() {
		this.name = IOTools.readLine("Name of the recipe: ");
		this.neededIng = IOTools
				.readInt("How many different ingredients are necessary? ");
	}

	public Recipe() {
		createRecipeAskingUser();
		this.recipeIngredient = new ArrayList<RecipeIngredient>();

	}

	public int getNeededIng() {
		return neededIng;
	}

	public void addIngredient(RecipeIngredient recipeIngredient) {
		this.recipeIngredient.add(recipeIngredient);
	}

	public String getName() {
		return this.name;
	}


	public int[] getQuantNec() {
		int[] getQuantNec = new int[getIngredientsSize()];
		for (int i = 0; i < getIngredientsSize(); i++)
			getQuantNec[i] = this.recipeIngredient.get(i).getQuantityNec();

		return getQuantNec;
	}
	
	
	public int getIngredientsSize() {
		return this.recipeIngredient.size();

	}

	public void print() {
		System.out.println("Recipe: " + getName());
		for (int i = 0; i < neededIng; i++) {
			System.out.println(recipeIngredient.get(i).getIngredient()
					.getName()
					+ " ["
					+ recipeIngredient.get(i).getQuantityNec()
					+ "]--> alcoholic?:"
					+ recipeIngredient.get(i).getIngredient().isAlcoholic());
		}

	}

}

Das ist ziemlich verschachtelt alles
Und ich weiß nicht wie ich z.Bsp. für die Methode getQuantNec ein Unittest schreiben kann...
 

0x7F800000

Top Contributor
Erstellst ein rezept, packst da hundert zufällige ingredients rein, rufst die methode auf, guggst dass das zurückgegebene Array die erwartete Länge hat, und alle Zahlen in richtiger Anzahl enthält?... Was soll man denn da großartig testen, diese methoden tun bisher praktisch nichts :confused:
 

mvitz

Top Contributor
Du müsste mir zumindest noch die Klassen:
- RecipeIngredient
und vermutlich noch
- Ingredient
geben :D

Habe gerade nicht die Lust mir da Dummyklassen zu zu schreiben, die dann evtl ganz anders als deine sind.

Was ich bisher anmerken möchte ist, dass die Methode
[HIGHLIGHT="Java"]public void createRecipeAskingUser() {
this.name = IOTools.readLine("Name of the recipe: ");
this.neededIng = IOTools
.readInt("How many different ingredients are necessary? ");
}
[/HIGHLIGHT]

meiner Meinung nach in dieser Klasse nichts zu suchen hat. Man sollte User Eingaben von den Daten trennen, was du heir eindeutig nicht tust.

Edit:
Andrey hat dir auch das allgemeine vorgehen aufgezeigt ^^
 

Java-Problems

Bekanntes Mitglied
ja das werde ich noch berücksichtigen und noch in eine separate Klasse miteinbauen!
Danke für den Tipp!
Code:
public class RecipeIngredient {

	private int quantityNec;
	private Ingredient ing;

	/**
	 * @return
	 */
	public int getQuantityNec() {
		return quantityNec;
	}

	/**
	 * @param quantityNec
	 */
	public void setQuantityNec(int quantityNec) {
		this.quantityNec = quantityNec;
	}

	/**
	 * @param ingredient
	 * @param quantityNec
	 */
	public void ingredient(Ingredient ingredient, int quantityNec) {
		this.ing = ingredient;
		setQuantityNec(quantityNec);
	}

	/**
	 * @return ing
	 */
	public Ingredient getIngredient() {
		return ing;
	}

}
Code:
public abstract class Ingredient {

	private String name;
	private int quantityAv;
	private int quantityNec;
	boolean alcoholic;

	public String getName() {
		return name;
	}

	public int getQuantityAv() {
		return quantityAv;
	}

	public boolean isAlcoholic() {
		return alcoholic;
	}

	public void setAlcoholic(boolean alcoholic) {
		this.alcoholic = alcoholic;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setQuantityAv(int quantityAv) {
		this.quantityAv = quantityAv;
	}

	@Override
	public String toString() {
		return this.getName() + " [" + this.getQuantityAv() + "]"
				+ " alcoloic: " + isAlcoholic();
	}

}
 

0x7F800000

Top Contributor
meiner Meinung nach in dieser Klasse nichts zu suchen hat. Man sollte User Eingaben von den Daten trennen, was du heir eindeutig nicht tust.
und sowas abartiges wie diese "print()"-methode sollte auch schleunigst aus dem code weginsektiziert werden. Wozu soll so etwas gut sein? Die ist i.Allg. nicht verwendbar und wirft die Ausgaben per Zufall irgendwohin, wohin das System.out. grad zeigt. Tausend millionen Buffer zu basteln und den Standardausgabestrom jedes mal umzubiegen, nur um deine Klasse irgendwo außer als auf der Standardkonsole auszugeben: das ist bekloppt das tut kein gesunder Mensch. Deswegen wird ja auch eine ordentliche toString()-methode vorgeschrieben.
 

mvitz

Top Contributor
Ich habe das ganze mal etwas umgeschrieben ^^. Wenn du deine Klassen so lassen möchtest, musst du halt mein Beispiel an dich anpassen. Deine aktuellen Klassen finde ich total unübersichtlich und irgendwie auch unlogisch...

Also jetzt meine:

Klasse Recipe stellt ein Rezept dar, es hat einen Namen und Rezeptzutaten.
[HIGHLIGHT="Java"]import java.util.LinkedList;
import java.util.List;

public class Recipe {

private String name;
private List<RecipeIngredient> ingredients;

public Recipe(String aName) {
name = aName;
ingredients = new LinkedList<RecipeIngredient>();

}

public void addIngredient(RecipeIngredient aIngredient) {
ingredients.add(aIngredient);
}

public int getNumberOfIngredients() {
return ingredients.size();
}

public int[] getNumberOfNeededIngredientQuantities() {
int[] quantities = new int[ingredients.size()];
for (int i = 0; i < ingredients.size(); i++) {
RecipeIngredient theIngredient = ingredients.get(i);
quantities = theIngredient.getNeededQuantity();
}
return quantities;
}

@Override
public String toString() {
StringBuffer theStringBuffer = new StringBuffer();
theStringBuffer.append("Recpipe: " + name + "\n");
for (RecipeIngredient eachIngredient : ingredients) {
theStringBuffer.append("\t" + eachIngredient + "\n");
}
return theStringBuffer.toString();
}
}[/HIGHLIGHT]

Eine Rezeptzutat besteht aus einer Zutat und einer benötigten Menge:
[HIGHLIGHT="Java"]public class RecipeIngredient {

private int neededQuantity;
private Ingredient ingredient;

public RecipeIngredient(Ingredient aIngredient, int aNeededQuantity) {
ingredient = aIngredient;
neededQuantity = aNeededQuantity;
}

public int getNeededQuantity() {
return neededQuantity;
}

public void setNeededQuantity(int neededQuantity) {
this.neededQuantity = neededQuantity;
}

public Ingredient getIngredient() {
return ingredient;
}

public void setIngredient(Ingredient ingredient) {
this.ingredient = ingredient;
}

@Override
public String toString() {
return ingredient + " [" + neededQuantity + "]";
}
}[/HIGHLIGHT]

Eine Zutat wiederrum hat einen Namen, eine aktuell vorhandene Menge und kann alkoholisch sein:
[HIGHLIGHT="Java"]public class Ingredient {

private String name;
private int quantity;
boolean alcoholic;

public Ingredient(String aName, int aQuantity, boolean isAlcoholic) {
name = aName;
quantity = aQuantity;
alcoholic = isAlcoholic;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getQuantity() {
return quantity;
}

public void setQuantity(int quantity) {
this.quantity = quantity;
}

public boolean isAlcoholic() {
return alcoholic;
}

public void setAlcoholic(boolean alcoholic) {
this.alcoholic = alcoholic;
}

@Override
public String toString() {
return name + " [" + quantity + "]" + " alcoloic: " + alcoholic;
}
}[/HIGHLIGHT]

Und zum Schluss der Test:
[HIGHLIGHT="Java"]import static junit.framework.Assert.assertEquals;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class RecipeTest {

private static Recipe recipe;

@Before
public void beforeEachTest() {
recipe = new Recipe("Testrezept.");
}

@After
public void afterEachTest() {
recipe = null;
}

@Test
public void getNumberOfNeededIngredientQuantities() {
RecipeIngredient test1 = createRecipeIngredient("test1", 10, false, 2);
RecipeIngredient test2 = createRecipeIngredient("test2", 10, true, 5);
recipe.addIngredient(test1);
recipe.addIngredient(test2);
int[] theExpectedResult = { 2, 5 };
int[] theActualResult = recipe.getNumberOfNeededIngredientQuantities();
assertEquals("Two ingredients should be added.",
theExpectedResult.length, theActualResult.length);
for (int i = 0; i < theExpectedResult.length; i++) {
String theMessage = "The ingredients needed quantity should be "
+ theExpectedResult + ".";
assertEquals(theMessage, theActualResult, theExpectedResult);
}
}

private static RecipeIngredient createRecipeIngredient(String aName,
int aQuantity, boolean isAlcoholic, int aNeededQuantity) {
Ingredient theIngredient = new Ingredient(aName, aQuantity, isAlcoholic);
RecipeIngredient theRecipeIngredient = new RecipeIngredient(
theIngredient, aNeededQuantity);
return theRecipeIngredient;
}
}[/HIGHLIGHT]

Sind noch zwei unschöne Sachen drin.
A) Die Ausgabe der benötigten Mengen als int[]. Ich bin mir nicht sicher ob eine foreach-Schleife immer dieselbe Reihenfolge garantiert deswegen die Zugriffe über den index. Einfach wäre es sicher etwas anderes zurückzugeben, nur was?

B) Die Klasse RecipeIngredient gefällt mir nicht. Aber habe atm keine Lust mir dazu was anderes auszudenken, evtl. schlägt ja wer anderes was vor.
 

0x7F800000

Top Contributor
A) Die Ausgabe der benötigten Mengen als int[]. Ich bin mir nicht sicher ob eine foreach-Schleife immer dieselbe Reihenfolge garantiert deswegen die Zugriffe über den index.
Bei lists wird die normale reihenfolge garantiert. Bei Sets sollte man aber aufpassen, da wird eh alles irgendwie bunt durcheinandergemischt. Aber da es ja ein List ist, ist es ok.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
bluetrix Hash Set hälfte entfernen Java Basics - Anfänger-Themen 7
RudiRüssel maximale Anzahl von Schlüsseln in einer Hash Tabelle Java Basics - Anfänger-Themen 2
J alternierendes Probing-Verfahren für Hash-Tabellen implementieren Java Basics - Anfänger-Themen 0
L Programmierung mit Hash Java Basics - Anfänger-Themen 3
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
B Denkanstoß - Hash ID für URL Java Basics - Anfänger-Themen 7
E Hash map Value Wert hochzuholen/ändern Java Basics - Anfänger-Themen 7
4a61766120617274697374 sha hash Java Basics - Anfänger-Themen 10
A Hash Tabelle Element suchen Java Basics - Anfänger-Themen 1
B Vererbung In offener Hash Tabelle einfügen Java Basics - Anfänger-Themen 4
T Hash von doubles generieren Java Basics - Anfänger-Themen 5
T Integer-Objekt über Hash-Funktion in Array ablegen Java Basics - Anfänger-Themen 1
E Hash Code dekodieren? Java Basics - Anfänger-Themen 20
T Hash Map Java Doc Einführung Java Basics - Anfänger-Themen 9
E Hash Map - Null Pointer Exception? Java Basics - Anfänger-Themen 3
MU5T4NG JPasswordField als Hash in Datenbank abspeichern Java Basics - Anfänger-Themen 3
L MD5 Hash berechnen Java Basics - Anfänger-Themen 2
P Casten Hash Map Java Basics - Anfänger-Themen 4
F Hash problem Java Basics - Anfänger-Themen 29
W automatischer password hash Java Basics - Anfänger-Themen 11
M Eigene Hash Funktion Java Basics - Anfänger-Themen 5
E Hash Map?? Java Basics - Anfänger-Themen 12
K eigene Hash-Datenstruktur Java Basics - Anfänger-Themen 2
I Hash Wert von Dateien erzeugen Java Basics - Anfänger-Themen 2
H java hash map: cd ablageprogramm Java Basics - Anfänger-Themen 2
G Implementieren einer Hash-Datenstrucktur Java Basics - Anfänger-Themen 3
C MD5-Hash in Java Java Basics - Anfänger-Themen 14
D Google maps bild mit marker versehen Java Basics - Anfänger-Themen 12
X Collections Collections Maps Frage Java Basics - Anfänger-Themen 4
S equalsIgnoreCase bei maps Java Basics - Anfänger-Themen 2
R Key/Value ohne Maps? Java Basics - Anfänger-Themen 2
M Collections Maps Java Basics - Anfänger-Themen 7
R Array von Maps Java Basics - Anfänger-Themen 8
H Maps? Wozu? Nutzen? Java Basics - Anfänger-Themen 3
K Maps mit veränderlichen Daten als Value Objekte Java Basics - Anfänger-Themen 3
D Fehler bei Maps.get Java Basics - Anfänger-Themen 27
M Frage zu Maps Java Basics - Anfänger-Themen 11
G Welche Datenstruktur ( Sets / Maps)? Java Basics - Anfänger-Themen 10
M Frage zu den ganzen Trees / Maps Java Basics - Anfänger-Themen 6
G Maps und Hibernate - Performancefrage Java Basics - Anfänger-Themen 2
M Speichern von Matrizen in Maps günstiger als in Arrays? Java Basics - Anfänger-Themen 22
G Weltkarte a la Google Maps Java Basics - Anfänger-Themen 4
P Was sind Vectoren und Maps in Java? Java Basics - Anfänger-Themen 3
N Suche Infos zu Maps - Collections Java Basics - Anfänger-Themen 4
G Google Maps und Java Java Basics - Anfänger-Themen 8
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
lizamcoden dateizugriff, arraylists Java Basics - Anfänger-Themen 15
S BubbleSort für ArrayLists Java Basics - Anfänger-Themen 3
C Anzahl ArrayLists unbekannt Java Basics - Anfänger-Themen 4
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70
HoT verschiedene ArrayLists mit ähnlichem Namen in for-Schleife aufrufen Java Basics - Anfänger-Themen 3
J Replace mit Hilfe von ArrayLists Java Basics - Anfänger-Themen 6
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
M BildLauf - ArrayLists - Denkanstoß Java Basics - Anfänger-Themen 2
I Daten aus Arraylists in eine Tabelle übertragen Java Basics - Anfänger-Themen 2
B ArrayLists in JCombobox Java Basics - Anfänger-Themen 10
I Mehrere ArrayLists mit einer for( : ) Schleife auf Inhalt prüfen Java Basics - Anfänger-Themen 6
T add-Methode für verschachtelte ArrayLists Java Basics - Anfänger-Themen 10
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
T Probleme mit ArrayList, in der Objekte gespeichert sind, die ArrayLists enthalten Java Basics - Anfänger-Themen 2
J 100 arraylists mit for-schleife erstellen und in hashmap einbinden Java Basics - Anfänger-Themen 11
F Argh: hab ArrayList von ArrayLists, Konstruktor will ArrayLists Java Basics - Anfänger-Themen 9
J ArrayLists initialisieren Java Basics - Anfänger-Themen 21
G ArrayLists, HashMaps, etc. vereinigen. Java Basics - Anfänger-Themen 6
J Primzahlen errechnen.ArrayLists abgleichen Java Basics - Anfänger-Themen 2
U ArrayLists und Casten Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben