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
Items 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 Kommentare [Atom]
Kommentar veröffentlichen