Produktverwaltung: Klassendokumentation finalisiert und Paketstruktur bereinigt
parent
0b53d089bc
commit
6684e97557
|
|
@ -1,15 +1 @@
|
||||||
[ {
|
[ ]
|
||||||
"productId" : "P-0001",
|
|
||||||
"bezeichnung" : "M6 Schraube",
|
|
||||||
"einzelpreisNetto" : 1.00,
|
|
||||||
"mwstSatz" : "NORMAL",
|
|
||||||
"beschreibung" : "",
|
|
||||||
"kategorie" : ""
|
|
||||||
}, {
|
|
||||||
"productId" : "P-0002",
|
|
||||||
"bezeichnung" : "M8 SCHRAUBE",
|
|
||||||
"einzelpreisNetto" : 2.00,
|
|
||||||
"mwstSatz" : "NORMAL",
|
|
||||||
"beschreibung" : "",
|
|
||||||
"kategorie" : ""
|
|
||||||
} ]
|
|
||||||
|
|
@ -14,47 +14,72 @@ import de.hsmannheim.faktura.product.MwstSatz;
|
||||||
import de.hsmannheim.faktura.product.Product;
|
import de.hsmannheim.faktura.product.Product;
|
||||||
import de.hsmannheim.faktura.product.repository.ProductRepository;
|
import de.hsmannheim.faktura.product.repository.ProductRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Komponententest-Klasse für den ProductService (Gruppe G).
|
||||||
|
* Überprüft die Einhaltung der funktionalen Anforderungen und Geschäftsregeln
|
||||||
|
* aus dem Pflichtenheft vollständig ohne GUI-Abhängigkeiten (NF-TEST-02)[cite: 51, 379].
|
||||||
|
*/
|
||||||
|
|
||||||
public class ProductServiceTest {
|
public class ProductServiceTest {
|
||||||
|
|
||||||
private ProductService productService;
|
private ProductService productService;
|
||||||
private ProductRepository productRepository;
|
private ProductRepository productRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setzt vor jedem einzelnen Testlauf eine frische Testumgebung auf
|
||||||
|
* und bereinigt den lokalen JSON-Cache, um Seiteneffekte zu verhindern[cite: 16, 143].
|
||||||
|
*/
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
productRepository = new ProductRepository();
|
productRepository = new ProductRepository();
|
||||||
productService = new ProductService(productRepository);
|
productService = new ProductService(productRepository);
|
||||||
|
|
||||||
// Cache leeren, damit alte JSON-Einträge die Tests nicht verfälschen
|
// Cache leeren, damit alte JSON-Einträge die Testergebnisse nicht verfälschen
|
||||||
for (Product p : productRepository.findAll()) {
|
for (Product p : productRepository.findAll()) {
|
||||||
productRepository.deleteById(p.getProductId());
|
productRepository.deleteById(p.getProductId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testet das erfolgreiche Anlegen eines validen Produkts mit allen Pflichtattributen.
|
||||||
|
* Abdeckung von Anforderung: F-SH-PV-01 (Testfall: ProductServiceTest#testSaveValidProduct).
|
||||||
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testSaveValidProduct() {
|
public void testSaveValidProduct() {
|
||||||
Product valid = new Product("P-0001", "M6 Schraube", new BigDecimal("10.50"), MwstSatz.NORMAL, "Beschreibung", "Werkzeug");
|
Product valid = new Product("P-0001", "M6 Schraube", new BigDecimal("10.50"), MwstSatz.NORMAL, "Beschreibung", "Werkzeug");
|
||||||
|
|
||||||
assertDoesNotThrow(() -> productService.saveProduct(valid));
|
assertDoesNotThrow(() -> productService.saveProduct(valid));
|
||||||
assertTrue(productService.getProductById("P-0001").isPresent());
|
assertTrue(productService.getProductById("P-0001").isPresent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prüft, ob Preise kleiner als 0.00 wie gefordert blockiert und mit einer Exception abgewiesen werden.
|
||||||
|
* Abdeckung von Anforderung: F-SH-PV-06 / AC-SH-PV-01 (Testfall: ProductServiceTest#testNegativePriceRejection)[cite: 142, 145, 159].
|
||||||
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testNegativePriceRejection() {
|
public void testNegativePriceRejection() {
|
||||||
// AC-SH-PV-01: Preis kleiner als 0.00 muss abgelehnt werden
|
// AC-SH-PV-01: Preis kleiner als 0.00 muss abgelehnt werden
|
||||||
Product invalidProduct = new Product("P-9999", "Testprodukt", new BigDecimal("-1.00"), MwstSatz.NORMAL, "Test", "Test");
|
Product invalidProduct = new Product("P-9999", "Testprodukt", new BigDecimal("-1.00"), MwstSatz.NORMAL, "Test", "Test");
|
||||||
|
|
||||||
// Kompakt ohne Rumpf-Klammern löst die Warnung auf
|
assertThrows(IllegalArgumentException.class, () -> {
|
||||||
assertThrows(IllegalArgumentException.class, () -> productService.saveProduct(invalidProduct));
|
productService.saveProduct(invalidProduct);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Überprüft die Echtzeit-Filterung der Produktliste anhand einer Teilmenge des Namens,
|
||||||
|
* wobei Groß- und Kleinschreibung ignoriert werden muss.
|
||||||
|
* Abdeckung von Anforderung: F-SH-PV-05 / AC-SH-PV-03 (Testfall: ProductServiceTest#testSearchCaseInsensitive)[cite: 150, 153, 159].
|
||||||
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testSearchCaseInsensitive() {
|
public void testSearchCaseInsensitive() {
|
||||||
// AC-SH-PV-03: Suchtest für Groß-/Kleinschreibung
|
|
||||||
Product p1 = new Product("P-0001", "M6 Schraube", new BigDecimal("1.00"), MwstSatz.NORMAL, "", "");
|
Product p1 = new Product("P-0001", "M6 Schraube", new BigDecimal("1.00"), MwstSatz.NORMAL, "", "");
|
||||||
Product p2 = new Product("P-0002", "M8 SCHRAUBE", new BigDecimal("2.00"), MwstSatz.NORMAL, "", "");
|
Product p2 = new Product("P-0002", "M8 SCHRAUBE", new BigDecimal("2.00"), MwstSatz.NORMAL, "", "");
|
||||||
|
|
||||||
productService.saveProduct(p1);
|
productService.saveProduct(p1);
|
||||||
productService.saveProduct(p2);
|
productService.saveProduct(p2);
|
||||||
|
|
||||||
|
// Suche nach "schraube" muss im Ergebnis exakt beide Objekte liefern
|
||||||
List<Product> results = productService.searchProducts("schraube");
|
List<Product> results = productService.searchProducts("schraube");
|
||||||
assertEquals(2, results.size());
|
assertEquals(2, results.size());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue