Mittwoch, 8. Oktober 2014
Musterlösung zu Unit-Tests
Musterlösung zur Aufgabe zu Unit-Tests
Folgende Grenzfälle werden getestet:
Die Artikel (Elemente/Items) werden in der Reihenfolge und der gegebenen Anzahl gespeichert, als
Testklasse:
Die Kommentare wurden für diesen Beitrag weggelassen, da die Klasse ohnedies schon sehr lange ist.
Implementierung des Interfaces ShoppingCart:
Zusätzlich zur originalen Aufgabenstellung wurde noch folgendes Interface implementiert, damit man einfach die Anzahl eines bestimmten Items bestimmen kann:
Zur Speicherung der
Die Klasse für die Artikel (
Folgende Grenzfälle werden getestet:
- 0 Elemente aufnehmen, Anzahl muss gleich bleiben
- 0 Elemente löschen, Anzahl muss gleich bleiben
- negative Anzahl Elemente aufnehmen, Exception
- negative Anzahl Elemente löschen, Exception
- nicht vorhandenes Element löschen, Exception
- 10 Elemente aufnehmen, Anzahl testen
- 10 Elemente aufnehmen, Ergebnis des Iterators testen
Die Artikel (Elemente/Items) werden in der Reihenfolge und der gegebenen Anzahl gespeichert, als
addItems()
aufgerufen wurde. Wird ein Element
mit der Anzahl 5 in den Warenkorb aufgenommen, so wird das Element 5 mal
gespeichert.Testklasse:
Die Kommentare wurden für diesen Beitrag weggelassen, da die Klasse ohnedies schon sehr lange ist.
import java.util.Iterator; import junit.framework.TestCase; public class ShoppingCartTest extends TestCase { private ShoppingCart cart; private ItemCount itemCount; private Item[] items = { new Item(1), new Item(2), new Item(3) }; protected void setUp() throws Exception { cart = new MyCart(); itemCount = (ItemCount) cart; } protected void tearDown() throws Exception { } public void testAddItems0() { try { cart.addItems(items[0], 0); assertEquals("testDeleteItems0: 0 Elemente", 0, cart.itemCount()); } catch (NegativeCountException e) { fail("testAddItem0: es dürfte keine NegativeCountException" + " geworfen werden"); } } public void testAddItemNegativ() { try { cart.addItems(items[0], -23); fail("testAddItemNegativ: es müsste eine NegativeCountException" + " geworfen werden"); } catch (NegativeCountException e) { } } public void testDeleteItems0() { try { cart.addItems(items[0], 1); cart.deleteItems(items[0], 0); assertEquals("testDeleteItems0: 1 Element", 1, cart.itemCount()); } catch (NegativeCountException e) { fail("testDeleteItems0: es dürfte keine NegativeCountException" + " geworfen werden"); } catch (NoSuchItemException e) { fail("testDeleteItems0: es dürfte keine NoSuchItemException" + " geworfen werden"); } } public void testDeleteItemsNoSuchItem() { try { cart.addItems(items[0], 1); cart.deleteItems(items[1], 1); fail("testDeleteItemsNoSuchItem: es müsste NoSuchItemException" + " geworfen werden"); } catch (NegativeCountException e) { fail("testDeleteItemsNoSuchItem: es dürfte keine" + " NegativeCountException geworfen werden"); } catch (NoSuchItemException e) { assertEquals("testDeleteItemsNoSuchItem: 1 Element", 1, cart.itemCount()); } } public void testDeleteItemNegativ() { try { cart.addItems(items[0], 2); cart.deleteItems(items[0], -23); fail("testAddItemNegativ: es müsste eine NegativeCountException" + " geworfen werden"); } catch (NegativeCountException e) { } catch (NoSuchItemException e) { fail("testAddItemNegativ: es dürfte keine NoSuchItemException" + " geworfen werden"); } } public void testAddItems10() { try { cart.addItems(items[0], 3); cart.addItems(items[1], 3); cart.addItems(items[2], 4); assertEquals("testAddItems10: 10 Elemente", 10, cart.itemCount()); } catch (NegativeCountException e) { fail("testAddItems10: es dürfte keine NegativeCountException" + " geworfen werden"); } } public void testAddDeleteItems5() { try { cart.addItems(items[0], 3); cart.addItems(items[1], 3); cart.addItems(items[2], 4); cart.deleteItems(items[0], 2); cart.deleteItems(items[2], 2); cart.deleteItems(items[1], 1); assertEquals("testAddDeleteItems5: 5 Elemente", 5, cart.itemCount()); } catch (NegativeCountException e) { fail("testAddDeleteItems5: es dürfte keine NegativeCountException" + " geworfen werden"); } catch (NoSuchItemException e) { fail("testAddDeleteItems5: es dürfte keine NoSuchItemException" + " geworfen werden"); } } public void testIterator() { try { cart.addItems(items[0], 3); cart.addItems(items[1], 3); cart.addItems(items[2], 4); Iterator<Item> iterator = cart.iterator(); int cntItems = 0; Item[] stroredItems = new Item[10]; while (iterator.hasNext()) { stroredItems[cntItems] = iterator.next(); cntItems++; } assertEquals("testIterator: 10 Elemente", 10, cntItems); for (int i = 0; i < 3; i++) { assertEquals("testIterator: Element sollte gleich sein", items[0], stroredItems[i]); System.out.println(stroredItems[i]); } for (int i = 3; i < 6; i++) { assertEquals("testIterator: Element sollte gleich sein", items[1], stroredItems[i]); System.out.println(stroredItems[i]); } for (int i = 6; i < 10; i++) { assertEquals("testIterator: Element sollte gleich sein", items[2], stroredItems[i]); System.out.println(stroredItems[i]); } } catch (NegativeCountException e) { fail("testIterator: es dürfte keine NegativeCountException" + " geworfen werden"); } } public void testItemCount() { try { cart.addItems(items[0], 3); cart.addItems(items[1], 3); cart.addItems(items[0], 1); cart.addItems(items[2], 4); cart.addItems(items[0], 2); assertEquals("testItemCount: Anzahl falsch", 6, itemCount.itemCount(items[0])); assertEquals("testItemCount: Anzahl falsch", 3, itemCount.itemCount(items[1])); assertEquals("testItemCount: Anzahl falsch", 4, itemCount.itemCount(items[2])); } catch (NegativeCountException e) { fail("testItemCount: es dürfte keine NegativeCountException" + " geworfen werden"); } catch (NoSuchItemException e) { fail("testItemCount: es dürfte keine NoSuchItemException" + " geworfen werden"); } } public void testItemCountNosuchItem() { @SuppressWarnings("unused") int cnt; try { cnt = itemCount.itemCount(items[0]); fail("testItemCountNosuchItem: es müsste eine NoSuchItemException" + " geworfen werden"); } catch (NoSuchItemException e) { } try { cart.addItems(items[1], 3); cnt = itemCount.itemCount(items[0]); fail("testItemCountNosuchItem: es müsste eine NoSuchItemException" + " geworfen werden"); } catch (NegativeCountException e) { fail("testItemCountNosuchItem: es dürfte keine" + " NegativeCountException geworfen werden"); } catch (NoSuchItemException e) { } } }
Implementierung des Interfaces ShoppingCart:
Zusätzlich zur originalen Aufgabenstellung wurde noch folgendes Interface implementiert, damit man einfach die Anzahl eines bestimmten Items bestimmen kann:
public interface ItemCount { public int itemCount(Item anItem) throws NoSuchItemException; }
Zur Speicherung der
Item
s wird einfach eine ArrayList
verwendet.
import java.util.ArrayList; import java.util.Iterator; public class MyCart implements ShoppingCart, ItemCount { private ArrayList<Item> items = new ArrayList<Item>(); public void addItems(Item anItem, int quantity) throws NegativeCountException { if (quantity < 0) { throw new NegativeCountException(); } for (int i = 0; i < quantity; i++) { items.add(anItem); } } public void deleteItems(Item anItem, int quantity) throws NegativeCountException, NoSuchItemException { if (quantity < 0) { throw new NegativeCountException(); } for (int i = 0; i < quantity; i++) { if (!items.remove(anItem)) throw new NoSuchItemException(); } } public int itemCount() { return items.size(); } public Iterator<Item> iterator() { return items.iterator(); } @Override public int itemCount(Item anItem) throws NoSuchItemException { int cnt = 0; if (!items.contains(anItem)) { throw new NoSuchItemException(); } for (Item item : items) { if (item == anItem) { cnt++; } } return cnt; } }Weiters müssen natürlich die geforderten Exceptions implementiert werden (Kommentare wurden auch hier weggelassen):
public class NegativeCountException extends Exception { }
public class NoSuchItemException extends Exception { }
Die Klasse für die Artikel (
Item
) wurde einfach durch eine Nummer ergänzt, die beim Konstruktor angegeben werden muss. Für eine realistische Anwendung müsste diese Klasse noch erweitert werden:
public class Item { private int itemNr = 0; public Item(int itemNr) { this.itemNr = itemNr; } @Override public String toString() { return "Item " + itemNr; } }
Labels: Java, Lösung, POS1-3, Testen
Abonnieren Posts [Atom]