diff --git a/pom.xml b/pom.xml
index 340baa2..ec71f5f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,9 +23,40 @@
5.10.0
test
+
+ org.mockito
+ mockito-core
+ 5.11.0
+ test
+
+
+ org.mockito
+ mockito-junit-jupiter
+ 5.11.0
+ test
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.11
+
+
+
+ prepare-agent
+
+
+
+ report
+ test
+
+ report
+
+
+
+
maven-compiler-plugin
3.11.0
diff --git a/src/main/java/de/antco/projekt/ConsoleUi.java b/src/main/java/de/antco/projekt/ConsoleUi.java
index 37d8589..00f9bf7 100644
--- a/src/main/java/de/antco/projekt/ConsoleUi.java
+++ b/src/main/java/de/antco/projekt/ConsoleUi.java
@@ -7,16 +7,25 @@ import de.antco.projekt.model.WorkOrderDetails;
import de.antco.projekt.model.WorkOrderItem;
import de.antco.projekt.service.WorkshopService;
+import java.io.InputStream;
+import java.io.PrintStream;
import java.sql.SQLException;
import java.util.*;
public class ConsoleUi {
private final WorkshopService service;
- private final Scanner scanner = new Scanner(System.in);
+ private final Scanner scanner;
+ private final PrintStream out;
public ConsoleUi(WorkshopService service) {
+ this(service, System.in, System.out);
+ }
+
+ public ConsoleUi(WorkshopService service, InputStream in, PrintStream out) {
this.service = service;
+ this.scanner = new Scanner(in);
+ this.out = out;
}
public void start() {
@@ -24,6 +33,7 @@ public class ConsoleUi {
while (running) {
showMenu();
+ if (!scanner.hasNextLine()) break;
String choice = scanner.nextLine().trim();
try {
@@ -35,78 +45,82 @@ public class ConsoleUi {
case "5" -> createWorkOrder();
case "6" -> showWorkOrders();
case "0" -> running = false;
- default -> System.out.println("Ungültige Eingabe.");
+ default -> out.println("Ungültige Eingabe.");
}
} catch (SQLException e) {
- System.out.println("Ein Fehler ist aufgetreten: " + e.getMessage());
+ out.println("Ein Fehler ist aufgetreten: " + e.getMessage());
}
}
- System.out.println("Programm beendet.");
+ out.println("Programm beendet.");
}
private void showMenu() {
- System.out.println("\n=== Werkstatt Menü ===");
- System.out.println("1) Kunde anlegen");
- System.out.println("2) Kunden anzeigen");
- System.out.println("3) Fahrzeug anlegen");
- System.out.println("4) Fahrzeuge einer Person anzeigen");
- System.out.println("5) Werkstattvorgang anlegen");
- System.out.println("6) Vorgänge anzeigen");
- System.out.println("0) Beenden");
- System.out.print("Auswahl: ");
+ out.println("\n=== Werkstatt Menü ===");
+ out.println("1) Kunde anlegen");
+ out.println("2) Kunden anzeigen");
+ out.println("3) Fahrzeug anlegen");
+ out.println("4) Fahrzeuge einer Person anzeigen");
+ out.println("5) Werkstattvorgang anlegen");
+ out.println("6) Vorgänge anzeigen");
+ out.println("0) Beenden");
+ out.print("Auswahl: ");
}
// ---------------- Eingabe-Hilfen ----------------
private int readInt(String text) {
while (true) {
- System.out.print(text);
+ out.print(text);
+ if (!scanner.hasNextLine()) return 0;
String input = scanner.nextLine();
try {
return Integer.parseInt(input.trim());
} catch (NumberFormatException e) {
- System.out.println("Bitte eine gültige Zahl eingeben.");
+ out.println("Bitte eine gültige Zahl eingeben.");
}
}
}
private String readNonEmpty(String text) {
while (true) {
- System.out.print(text);
+ out.print(text);
+ if (!scanner.hasNextLine()) return "";
String value = scanner.nextLine().trim();
if (!value.isEmpty()) {
return value;
}
- System.out.println("Eingabe darf nicht leer sein.");
+ out.println("Eingabe darf nicht leer sein.");
}
}
private String readValidName(String text) {
while (true) {
String name = readNonEmpty(text);
+ if (name.isEmpty()) return "";
if (name.matches("[a-zA-ZäöüÄÖÜß ]+")) {
return name;
}
- System.out.println("Der Name darf nur Buchstaben enthalten.");
+ out.println("Der Name darf nur Buchstaben enthalten.");
}
}
private String readPhoneNumber(String text) {
while (true) {
- System.out.print(text);
+ out.print(text);
+ if (!scanner.hasNextLine()) return "";
String phone = scanner.nextLine().trim();
if (phone.matches("\\d+")) {
return phone;
}
- System.out.println("Telefonnummer darf nur Zahlen enthalten.");
+ out.println("Telefonnummer darf nur Zahlen enthalten.");
}
}
@@ -118,30 +132,33 @@ public class ConsoleUi {
String email = readNonEmpty("Email: ");
String address = readNonEmpty("Adresse: ");
+ if (name.isEmpty() || phone.isEmpty() || email.isEmpty() || address.isEmpty()) return;
+
Person person = service.createPerson(name, phone, email, address);
- System.out.println("Kunde gespeichert (ID: " + person.getId() + ")");
+ out.println("Kunde gespeichert (ID: " + person.getId() + ")");
}
private void showPersons() throws SQLException {
List persons = service.listPersons();
if (persons.isEmpty()) {
- System.out.println("Keine Kunden vorhanden.");
+ out.println("Keine Kunden vorhanden.");
return;
}
- System.out.println("\n--- Kundenliste ---");
- persons.forEach(System.out::println);
+ out.println("\n--- Kundenliste ---");
+ persons.forEach(p -> out.println(p));
}
// ---------------- Fahrzeuge ----------------
private void addVehicle() throws SQLException {
int personId = readInt("Personen-ID: ");
+ if (personId == 0) return;
Person person = service.findPerson(personId);
if (person == null) {
- System.out.println("Person wurde nicht gefunden.");
+ out.println("Person wurde nicht gefunden.");
return;
}
@@ -149,26 +166,29 @@ public class ConsoleUi {
String model = readNonEmpty("Modell: ");
String plate = readNonEmpty("Kennzeichen: ");
+ if (brand.isEmpty() || model.isEmpty() || plate.isEmpty()) return;
+
Vehicle vehicle = service.createVehicle(personId, brand, model, plate);
- System.out.println("Fahrzeug angelegt (ID: " + vehicle.getId() + ")");
+ out.println("Fahrzeug angelegt (ID: " + vehicle.getId() + ")");
}
private void showVehiclesOfPerson() throws SQLException {
int personId = readInt("Personen-ID: ");
+ if (personId == 0) return;
Person person = service.findPerson(personId);
if (person == null) {
- System.out.println("Person nicht gefunden.");
+ out.println("Person nicht gefunden.");
return;
}
List vehicles = service.listVehicles(personId);
- System.out.println("Fahrzeuge von " + person.getName() + ":");
+ out.println("Fahrzeuge von " + person.getName() + ":");
if (vehicles.isEmpty()) {
- System.out.println("Keine Fahrzeuge vorhanden.");
+ out.println("Keine Fahrzeuge vorhanden.");
} else {
- vehicles.forEach(System.out::println);
+ vehicles.forEach(v -> out.println(v));
}
}
@@ -176,10 +196,11 @@ public class ConsoleUi {
private void createWorkOrder() throws SQLException {
int vehicleId = readInt("Fahrzeug-ID: ");
+ if (vehicleId == 0) return;
Vehicle vehicle = service.findVehicle(vehicleId);
if (vehicle == null) {
- System.out.println("Fahrzeug nicht gefunden.");
+ out.println("Fahrzeug nicht gefunden.");
return;
}
@@ -189,10 +210,11 @@ public class ConsoleUi {
Map selectedItems = new LinkedHashMap<>();
while (true) {
- System.out.println("\n--- Service-Katalog ---");
- catalog.forEach(System.out::println);
+ out.println("\n--- Service-Katalog ---");
+ catalog.forEach(item -> out.println(item));
- System.out.print("Service-ID (leer = fertig): ");
+ out.print("Service-ID (leer = fertig): ");
+ if (!scanner.hasNextLine()) break;
String input = scanner.nextLine().trim();
if (input.isEmpty()) {
@@ -203,23 +225,24 @@ public class ConsoleUi {
try {
serviceId = Integer.parseInt(input);
} catch (NumberFormatException e) {
- System.out.println("Bitte eine gültige ID eingeben.");
+ out.println("Bitte eine gültige ID eingeben.");
continue;
}
+ int finalServiceId = serviceId;
ServiceItem item = catalog.stream()
- .filter(s -> s.getId() == serviceId)
+ .filter(s -> s.getId() == finalServiceId)
.findFirst()
.orElse(null);
if (item == null) {
- System.out.println("Service nicht gefunden.");
+ out.println("Service nicht gefunden.");
continue;
}
int qty = readInt("Menge: ");
if (qty <= 0) {
- System.out.println("Menge muss größer als 0 sein.");
+ out.println("Menge muss größer als 0 sein.");
continue;
}
@@ -227,39 +250,39 @@ public class ConsoleUi {
}
if (selectedItems.isEmpty()) {
- System.out.println("Keine Positionen ausgewählt.");
+ out.println("Keine Positionen ausgewählt.");
return;
}
int orderId = service.createWorkOrder(vehicleId, note, selectedItems);
- System.out.println("Vorgang wurde angelegt (ID: " + orderId + ")");
+ out.println("Vorgang wurde angelegt (ID: " + orderId + ")");
}
private void showWorkOrders() throws SQLException {
List orders = service.listWorkOrders();
if (orders.isEmpty()) {
- System.out.println("Keine Vorgänge vorhanden.");
+ out.println("Keine Vorgänge vorhanden.");
return;
}
for (WorkOrderDetails order : orders) {
- System.out.println("\n--- Vorgang " + order.getOrderId() + " ---");
- System.out.println("Kunde: " + order.getPersonName());
- System.out.println("Fahrzeug: " + order.getVehicleText());
- System.out.println("Datum: " + order.getCreatedAt());
+ out.println("\n--- Vorgang " + order.getOrderId() + " ---");
+ out.println("Kunde: " + order.getPersonName());
+ out.println("Fahrzeug: " + order.getVehicleText());
+ out.println("Datum: " + order.getCreatedAt());
if (order.getNote() != null && !order.getNote().isBlank()) {
- System.out.println("Notiz: " + order.getNote());
+ out.println("Notiz: " + order.getNote());
}
for (WorkOrderItem item : order.getItems()) {
- System.out.println(" - " + item.getServiceItem().getTitle() +
+ out.println(" - " + item.getServiceItem().getTitle() +
" x" + item.getQuantity() +
" = " + item.getTotalPrice() + " €");
}
- System.out.println("Gesamtsumme: " + order.getTotal() + " €");
+ out.println("Gesamtsumme: " + order.getTotal() + " €");
}
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/de/antco/projekt/service/WorkshopService.java b/src/main/java/de/antco/projekt/service/WorkshopService.java
index ebff2ef..3ef794b 100644
--- a/src/main/java/de/antco/projekt/service/WorkshopService.java
+++ b/src/main/java/de/antco/projekt/service/WorkshopService.java
@@ -15,20 +15,28 @@ import java.util.List;
import java.util.Map;
public class WorkshopService {
- private final PersonDao personDao = new PersonDao();
- private final VehicleDao vehicleDao = new VehicleDao();
- private final ServiceItemDao serviceItemDao = new ServiceItemDao();
- private final WorkOrderDao workOrderDao = new WorkOrderDao();
+ private final PersonDao personDao;
+ private final VehicleDao vehicleDao;
+ private final ServiceItemDao serviceItemDao;
+ private final WorkOrderDao workOrderDao;
public WorkshopService() {
+ this(new PersonDao(), new VehicleDao(), new ServiceItemDao(), new WorkOrderDao());
try {
new SchemaCreator().ensureSchema();
- serviceItemDao.seedDefaultItems();
+ this.serviceItemDao.seedDefaultItems();
} catch (SQLException e) {
throw new RuntimeException("Setup fehlgeschlagen: " + e.getMessage(), e);
}
}
+ public WorkshopService(PersonDao personDao, VehicleDao vehicleDao, ServiceItemDao serviceItemDao, WorkOrderDao workOrderDao) {
+ this.personDao = personDao;
+ this.vehicleDao = vehicleDao;
+ this.serviceItemDao = serviceItemDao;
+ this.workOrderDao = workOrderDao;
+ }
+
public Person createPerson(String name, String phone, String email, String address) throws SQLException {
return personDao.create(name, phone, email, address);
}
diff --git a/src/test/java/de/antco/projekt/AppTest.java b/src/test/java/de/antco/projekt/AppTest.java
new file mode 100644
index 0000000..02d558c
--- /dev/null
+++ b/src/test/java/de/antco/projekt/AppTest.java
@@ -0,0 +1,35 @@
+package de.antco.projekt;
+
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+
+import java.io.ByteArrayInputStream;
+import java.sql.Connection;
+import java.sql.Statement;
+
+import static org.mockito.Mockito.*;
+
+class AppTest {
+
+ @Test
+ void testMain() throws Exception {
+ try (MockedStatic db = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ Statement st = mock(Statement.class);
+
+ db.when(Database::getConnection).thenReturn(conn);
+ when(conn.createStatement()).thenReturn(st);
+
+ // Mock System.in to exit immediately
+ System.setIn(new ByteArrayInputStream("0\n".getBytes()));
+
+ // We need to ensure serviceItemDao.seedDefaultItems() doesn't fail
+ // It uses Database.getConnection() too, and prepared statements.
+ // It calls 'findAll' (select) and 'create' (insert).
+ // This is getting complicated to mock everything for a full integration test.
+ // But let's try basic mocking.
+
+ App.main(new String[]{});
+ }
+ }
+}
diff --git a/src/test/java/de/antco/projekt/ConsoleUiTest.java b/src/test/java/de/antco/projekt/ConsoleUiTest.java
new file mode 100644
index 0000000..f723dc9
--- /dev/null
+++ b/src/test/java/de/antco/projekt/ConsoleUiTest.java
@@ -0,0 +1,183 @@
+package de.antco.projekt;
+
+import de.antco.projekt.model.*;
+import de.antco.projekt.service.WorkshopService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
+import java.sql.SQLException;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+class ConsoleUiTest {
+
+ @Mock
+ private WorkshopService service;
+
+ private ByteArrayOutputStream outContent;
+
+ @BeforeEach
+ void setUp() {
+ outContent = new ByteArrayOutputStream();
+ }
+
+ private ConsoleUi createUi(String input) {
+ ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
+ return new ConsoleUi(service, in, new PrintStream(outContent));
+ }
+
+ @Test
+ void testExit() {
+ ConsoleUi ui = createUi("0\n");
+ ui.start();
+ assertTrue(outContent.toString().contains("Programm beendet"));
+ }
+
+ @Test
+ void testInvalidMenuOption() {
+ ConsoleUi ui = createUi("99\n0\n");
+ ui.start();
+ assertTrue(outContent.toString().contains("Ungültige Eingabe"));
+ }
+
+ @Test
+ void testAddPerson() throws SQLException {
+ ConsoleUi ui = createUi("1\nMax\n123\nmail\naddr\n0\n");
+ Person p = new Person(1, "Max", "123", "mail", "addr");
+ when(service.createPerson("Max", "123", "mail", "addr")).thenReturn(p);
+ ui.start();
+ verify(service).createPerson("Max", "123", "mail", "addr");
+ assertTrue(outContent.toString().contains("Kunde gespeichert"));
+ }
+
+ @Test
+ void testShowPersons() throws SQLException {
+ ConsoleUi ui = createUi("2\n0\n");
+ when(service.listPersons()).thenReturn(Collections.emptyList());
+ ui.start();
+ verify(service).listPersons();
+ assertTrue(outContent.toString().contains("Keine Kunden vorhanden"));
+ }
+
+ @Test
+ void testAddVehicle() throws SQLException {
+ // 3 -> Person ID -> Brand -> Model -> Plate -> 0
+ ConsoleUi ui = createUi("3\n1\nVW\nGolf\nABC\n0\n");
+ Person p = new Person(1, "Max", "123", "m", "a");
+ Vehicle v = new Vehicle(10, 1, "VW", "Golf", "ABC");
+
+ when(service.findPerson(1)).thenReturn(p);
+ when(service.createVehicle(1, "VW", "Golf", "ABC")).thenReturn(v);
+
+ ui.start();
+ assertTrue(outContent.toString().contains("Fahrzeug angelegt"));
+ }
+
+ @Test
+ void testAddVehiclePersonNotFound() throws SQLException {
+ ConsoleUi ui = createUi("3\n99\n0\n");
+ when(service.findPerson(99)).thenReturn(null);
+ ui.start();
+ assertTrue(outContent.toString().contains("Person wurde nicht gefunden"));
+ }
+
+ @Test
+ void testShowVehicles() throws SQLException {
+ ConsoleUi ui = createUi("4\n1\n0\n");
+ Person p = new Person(1, "Max", "123", "m", "a");
+ when(service.findPerson(1)).thenReturn(p);
+ when(service.listVehicles(1)).thenReturn(Collections.emptyList());
+
+ ui.start();
+ assertTrue(outContent.toString().contains("Keine Fahrzeuge vorhanden"));
+ }
+
+ @Test
+ void testCreateWorkOrder() throws SQLException {
+ // 5 -> Vehicle ID -> Note -> Service ID -> Qty -> Empty (Finish) -> 0
+ ConsoleUi ui = createUi("5\n10\nNote\n100\n2\n\n0\n");
+ Vehicle v = new Vehicle(10, 1, "VW", "Golf", "ABC");
+ ServiceItem item = new ServiceItem(100, "Oil", BigDecimal.TEN);
+
+ when(service.findVehicle(10)).thenReturn(v);
+ when(service.listServiceItems()).thenReturn(List.of(item));
+ when(service.createWorkOrder(eq(10), eq("Note"), anyMap())).thenReturn(555);
+
+ ui.start();
+ assertTrue(outContent.toString().contains("Vorgang wurde angelegt (ID: 555)"));
+ }
+
+ @Test
+ void testCreateWorkOrderServiceNotFoundAndInvalidQty() throws SQLException {
+ // 5 -> Vehicle -> Note -> 999 (Invalid Service) -> 100 (Valid) -> -1 (Invalid Qty) -> 100 (Valid) -> 1 (Valid Qty) -> Finish -> 0
+ ConsoleUi ui = createUi("5\n10\nNote\n999\n100\n-1\n100\n1\n\n0\n");
+ Vehicle v = new Vehicle(10, 1, "VW", "Golf", "ABC");
+ ServiceItem item = new ServiceItem(100, "Oil", BigDecimal.TEN);
+
+ when(service.findVehicle(10)).thenReturn(v);
+ when(service.listServiceItems()).thenReturn(List.of(item));
+ when(service.createWorkOrder(eq(10), eq("Note"), anyMap())).thenReturn(555);
+
+ ui.start();
+ String output = outContent.toString();
+ assertTrue(output.contains("Service nicht gefunden"));
+ assertTrue(output.contains("Menge muss größer als 0 sein"));
+ }
+
+ @Test
+ void testShowWorkOrders() throws SQLException {
+ ConsoleUi ui = createUi("6\n0\n");
+ WorkOrderDetails wod = new WorkOrderDetails(1, "P", "V", LocalDateTime.now(), "N", Collections.emptyList(), BigDecimal.ZERO);
+ when(service.listWorkOrders()).thenReturn(List.of(wod));
+
+ ui.start();
+ assertTrue(outContent.toString().contains("Vorgang 1"));
+ }
+
+ @Test
+ void testSQLExceptionHandling() throws SQLException {
+ ConsoleUi ui = createUi("2\n0\n");
+ when(service.listPersons()).thenThrow(new SQLException("DB Error"));
+ ui.start();
+ assertTrue(outContent.toString().contains("Ein Fehler ist aufgetreten: DB Error"));
+ }
+
+ @Test
+ void testInputValidation() throws SQLException {
+ // 1 (Add Person)
+ // Name: "123" (invalid) -> "Max" (valid)
+ // Phone: "abc" (invalid) -> "123" (valid)
+ // Email: "" (empty - loop) -> "mail"
+ // Address: "addr"
+ // 0 (Exit)
+
+ String input = "1\n123\nMax\nabc\n123\n\nmail\naddr\n0\n";
+ ConsoleUi ui = createUi(input);
+
+ Person p = new Person(1, "Max", "123", "mail", "addr");
+ when(service.createPerson("Max", "123", "mail", "addr")).thenReturn(p);
+
+ ui.start();
+
+ String output = outContent.toString();
+ assertTrue(output.contains("Der Name darf nur Buchstaben enthalten"));
+ assertTrue(output.contains("Telefonnummer darf nur Zahlen enthalten"));
+ assertTrue(output.contains("Eingabe darf nicht leer sein"));
+ assertTrue(output.contains("Kunde gespeichert"));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/de/antco/projekt/dao/PersonDaoTest.java b/src/test/java/de/antco/projekt/dao/PersonDaoTest.java
new file mode 100644
index 0000000..692c9de
--- /dev/null
+++ b/src/test/java/de/antco/projekt/dao/PersonDaoTest.java
@@ -0,0 +1,84 @@
+package de.antco.projekt.dao;
+
+import de.antco.projekt.Database;
+import de.antco.projekt.model.Person;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+class PersonDaoTest {
+
+ @Test
+ void testCreate() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+ when(rs.next()).thenReturn(true);
+ when(rs.getInt("id")).thenReturn(1);
+
+ PersonDao dao = new PersonDao();
+ Person p = dao.create("Name", "Phone", "Email", "Addr");
+
+ assertNotNull(p);
+ assertEquals("Name", p.getName());
+ verify(ps).setString(1, "Name");
+ verify(ps).setString(2, "Phone");
+ verify(ps).setString(3, "Email");
+ verify(ps).setString(4, "Addr");
+ }
+ }
+
+ @Test
+ void testFindAll() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+ // Return true once, then false
+ when(rs.next()).thenReturn(true).thenReturn(false);
+ when(rs.getInt("id")).thenReturn(1);
+ when(rs.getString("name")).thenReturn("Name");
+ when(rs.getString("phone")).thenReturn("Phone");
+ when(rs.getString("email")).thenReturn("Email");
+ when(rs.getString("address")).thenReturn("Address");
+
+ PersonDao dao = new PersonDao();
+ assertEquals(1, dao.findAll().size());
+ }
+ }
+
+ @Test
+ void testFindById() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+ when(rs.next()).thenReturn(true);
+ when(rs.getInt("id")).thenReturn(1);
+ when(rs.getString("name")).thenReturn("Name");
+
+ PersonDao dao = new PersonDao();
+ assertNotNull(dao.findById(1));
+ }
+ }
+}
diff --git a/src/test/java/de/antco/projekt/dao/SchemaCreatorTest.java b/src/test/java/de/antco/projekt/dao/SchemaCreatorTest.java
new file mode 100644
index 0000000..d3889ac
--- /dev/null
+++ b/src/test/java/de/antco/projekt/dao/SchemaCreatorTest.java
@@ -0,0 +1,29 @@
+package de.antco.projekt.dao;
+
+import de.antco.projekt.Database;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+
+import java.sql.Connection;
+import java.sql.Statement;
+
+import static org.mockito.Mockito.*;
+
+class SchemaCreatorTest {
+
+ @Test
+ void testEnsureSchema() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ Statement st = mock(Statement.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.createStatement()).thenReturn(st);
+
+ SchemaCreator creator = new SchemaCreator();
+ creator.ensureSchema();
+
+ verify(st, atLeastOnce()).execute(anyString());
+ }
+ }
+}
diff --git a/src/test/java/de/antco/projekt/dao/ServiceItemDaoTest.java b/src/test/java/de/antco/projekt/dao/ServiceItemDaoTest.java
new file mode 100644
index 0000000..d8fd413
--- /dev/null
+++ b/src/test/java/de/antco/projekt/dao/ServiceItemDaoTest.java
@@ -0,0 +1,96 @@
+package de.antco.projekt.dao;
+
+import de.antco.projekt.Database;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+class ServiceItemDaoTest {
+
+ @Test
+ void testFindAll() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+ when(rs.next()).thenReturn(false);
+
+ ServiceItemDao dao = new ServiceItemDao();
+ assertTrue(dao.findAll().isEmpty());
+ }
+ }
+
+ @Test
+ void testSeedDefaultItems() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement psCount = mock(PreparedStatement.class);
+ PreparedStatement psInsert = mock(PreparedStatement.class);
+ ResultSet rsCount = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(contains("SELECT COUNT"))).thenReturn(psCount);
+ when(conn.prepareStatement(contains("INSERT"))).thenReturn(psInsert);
+
+ when(psCount.executeQuery()).thenReturn(rsCount);
+ when(rsCount.next()).thenReturn(true);
+ when(rsCount.getInt(1)).thenReturn(0); // Count 0 -> Insert
+
+ ServiceItemDao dao = new ServiceItemDao();
+ dao.seedDefaultItems();
+
+ verify(psInsert, atLeastOnce()).executeUpdate();
+ }
+ }
+
+ @Test
+ void testFindAllWithData() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+ when(rs.next()).thenReturn(true).thenReturn(false);
+ when(rs.getInt("id")).thenReturn(1);
+ when(rs.getString("title")).thenReturn("T");
+ when(rs.getBigDecimal("price")).thenReturn(java.math.BigDecimal.ONE);
+
+ ServiceItemDao dao = new ServiceItemDao();
+ assertEquals(1, dao.findAll().size());
+ }
+ }
+
+ @Test
+ void testFindById() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+ when(rs.next()).thenReturn(true);
+ when(rs.getInt("id")).thenReturn(1);
+ when(rs.getString("title")).thenReturn("T");
+ when(rs.getBigDecimal("price")).thenReturn(java.math.BigDecimal.TEN);
+
+ ServiceItemDao dao = new ServiceItemDao();
+ assertNotNull(dao.findById(1));
+ }
+ }
+}
diff --git a/src/test/java/de/antco/projekt/dao/VehicleDaoTest.java b/src/test/java/de/antco/projekt/dao/VehicleDaoTest.java
new file mode 100644
index 0000000..fc55b7f
--- /dev/null
+++ b/src/test/java/de/antco/projekt/dao/VehicleDaoTest.java
@@ -0,0 +1,64 @@
+package de.antco.projekt.dao;
+
+import de.antco.projekt.Database;
+import de.antco.projekt.model.Vehicle;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+class VehicleDaoTest {
+
+ @Test
+ void testCreate() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+ when(rs.next()).thenReturn(true);
+ when(rs.getInt("id")).thenReturn(10);
+
+ VehicleDao dao = new VehicleDao();
+ Vehicle v = dao.create(1, "B", "M", "P");
+
+ assertEquals(10, v.getId());
+ verify(ps).setInt(1, 1);
+ verify(ps).setString(2, "B");
+ }
+ }
+
+ @Test
+ void testFind() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps);
+ when(ps.executeQuery()).thenReturn(rs);
+
+ // findByPerson (1 row, then end), then findById (1 row)
+ when(rs.next()).thenReturn(true, false, true);
+ when(rs.getInt("id")).thenReturn(10);
+ when(rs.getInt("person_id")).thenReturn(1);
+ when(rs.getString("brand")).thenReturn("B");
+ when(rs.getString("model")).thenReturn("M");
+ when(rs.getString("plate")).thenReturn("P");
+
+ VehicleDao dao = new VehicleDao();
+ assertEquals(1, dao.findByPerson(1).size());
+ assertNotNull(dao.findById(10));
+ }
+ }
+}
diff --git a/src/test/java/de/antco/projekt/dao/WorkOrderDaoTest.java b/src/test/java/de/antco/projekt/dao/WorkOrderDaoTest.java
new file mode 100644
index 0000000..34a8f97
--- /dev/null
+++ b/src/test/java/de/antco/projekt/dao/WorkOrderDaoTest.java
@@ -0,0 +1,82 @@
+package de.antco.projekt.dao;
+
+import de.antco.projekt.Database;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Collections;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+class WorkOrderDaoTest {
+
+ @Test
+ void testCreateWorkOrder() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement ps = mock(PreparedStatement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+ when(conn.prepareStatement(anyString())).thenReturn(ps); // For INSERT work_order
+ // We need to handle multiple prepareStatement calls if possible, or relax verification
+
+ // First PS (WorkOrder)
+ when(ps.executeQuery()).thenReturn(rs);
+ when(rs.next()).thenReturn(true);
+ when(rs.getInt("id")).thenReturn(100); // New Order ID
+
+ WorkOrderDao dao = new WorkOrderDao();
+ int id = dao.createWorkOrder(1, "Note", java.util.Map.of(1, 1));
+ assertEquals(100, id);
+ }
+ }
+
+ @Test
+ void testCreateWorkOrderEmptyItems() {
+ WorkOrderDao dao = new WorkOrderDao();
+ assertThrows(IllegalArgumentException.class, () -> dao.createWorkOrder(1, "Note", Collections.emptyMap()));
+ }
+
+ @Test
+ void testFetchAllDetails() throws Exception {
+ try (MockedStatic mockedDb = mockStatic(Database.class)) {
+ Connection conn = mock(Connection.class);
+ PreparedStatement psItems = mock(PreparedStatement.class);
+ PreparedStatement psOrders = mock(PreparedStatement.class);
+ ResultSet rsItems = mock(ResultSet.class);
+ ResultSet rsOrders = mock(ResultSet.class);
+
+ mockedDb.when(Database::getConnection).thenReturn(conn);
+
+ // loadItems calls prepareStatement first, then fetchAllDetails calls it.
+ when(conn.prepareStatement(anyString()))
+ .thenReturn(psItems)
+ .thenReturn(psOrders);
+
+ when(psItems.executeQuery()).thenReturn(rsItems);
+ when(psOrders.executeQuery()).thenReturn(rsOrders);
+
+ // No items
+ when(rsItems.next()).thenReturn(false);
+
+ // One order
+ when(rsOrders.next()).thenReturn(true).thenReturn(false);
+ when(rsOrders.getInt("id")).thenReturn(1);
+ when(rsOrders.getString("person_name")).thenReturn("P");
+ when(rsOrders.getString("brand")).thenReturn("B");
+ when(rsOrders.getString("model")).thenReturn("M");
+ when(rsOrders.getString("plate")).thenReturn("Pl");
+ when(rsOrders.getString("note")).thenReturn("N");
+ when(rsOrders.getTimestamp("created_at")).thenReturn(java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()));
+
+ WorkOrderDao dao = new WorkOrderDao();
+ assertFalse(dao.fetchAllDetails().isEmpty());
+ }
+ }
+}
diff --git a/src/test/java/de/antco/projekt/model/ServiceItemTest.java b/src/test/java/de/antco/projekt/model/ServiceItemTest.java
new file mode 100644
index 0000000..1936c89
--- /dev/null
+++ b/src/test/java/de/antco/projekt/model/ServiceItemTest.java
@@ -0,0 +1,23 @@
+package de.antco.projekt.model;
+
+import org.junit.jupiter.api.Test;
+import java.math.BigDecimal;
+import static org.junit.jupiter.api.Assertions.*;
+
+class ServiceItemTest {
+ @Test
+ void testConstructorAndGetters() {
+ ServiceItem item = new ServiceItem(1, "Test Service", new BigDecimal("99.99"));
+ assertEquals(1, item.getId());
+ assertEquals("Test Service", item.getTitle());
+ assertEquals(new BigDecimal("99.99"), item.getPrice());
+ }
+
+ @Test
+ void testToString() {
+ ServiceItem item = new ServiceItem(1, "Test Service", new BigDecimal("99.99"));
+ String s = item.toString();
+ assertTrue(s.contains("Test Service"));
+ assertTrue(s.contains("99.99"));
+ }
+}
diff --git a/src/test/java/de/antco/projekt/model/WorkOrderDetailsTest.java b/src/test/java/de/antco/projekt/model/WorkOrderDetailsTest.java
new file mode 100644
index 0000000..6421c6e
--- /dev/null
+++ b/src/test/java/de/antco/projekt/model/WorkOrderDetailsTest.java
@@ -0,0 +1,23 @@
+package de.antco.projekt.model;
+
+import org.junit.jupiter.api.Test;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import static org.junit.jupiter.api.Assertions.*;
+
+class WorkOrderDetailsTest {
+ @Test
+ void testConstructorAndGetters() {
+ LocalDateTime now = LocalDateTime.now();
+ WorkOrderDetails details = new WorkOrderDetails(1, "Person", "Vehicle", now, "Note", Collections.emptyList(), BigDecimal.ZERO);
+
+ assertEquals(1, details.getOrderId());
+ assertEquals("Person", details.getPersonName());
+ assertEquals("Vehicle", details.getVehicleText());
+ assertEquals(now, details.getCreatedAt());
+ assertEquals("Note", details.getNote());
+ assertTrue(details.getItems().isEmpty());
+ assertEquals(BigDecimal.ZERO, details.getTotal());
+ }
+}
diff --git a/src/test/java/de/antco/projekt/model/WorkOrderItemTest.java b/src/test/java/de/antco/projekt/model/WorkOrderItemTest.java
new file mode 100644
index 0000000..4782fb6
--- /dev/null
+++ b/src/test/java/de/antco/projekt/model/WorkOrderItemTest.java
@@ -0,0 +1,19 @@
+package de.antco.projekt.model;
+
+import org.junit.jupiter.api.Test;
+import java.math.BigDecimal;
+import static org.junit.jupiter.api.Assertions.*;
+
+class WorkOrderItemTest {
+ @Test
+ void testConstructorAndGetters() {
+ ServiceItem item = new ServiceItem(1, "Service", new BigDecimal("10.00"));
+ WorkOrderItem woi = new WorkOrderItem(10, 20, item, 3);
+
+ assertEquals(10, woi.getId());
+ assertEquals(20, woi.getWorkOrderId());
+ assertEquals(item, woi.getServiceItem());
+ assertEquals(3, woi.getQuantity());
+ assertEquals(new BigDecimal("30.00"), woi.getTotalPrice());
+ }
+}
diff --git a/src/test/java/de/antco/projekt/model/WorkOrderTest.java b/src/test/java/de/antco/projekt/model/WorkOrderTest.java
new file mode 100644
index 0000000..c599af6
--- /dev/null
+++ b/src/test/java/de/antco/projekt/model/WorkOrderTest.java
@@ -0,0 +1,17 @@
+package de.antco.projekt.model;
+
+import org.junit.jupiter.api.Test;
+import java.time.LocalDateTime;
+import static org.junit.jupiter.api.Assertions.*;
+
+class WorkOrderTest {
+ @Test
+ void testConstructorAndGetters() {
+ LocalDateTime now = LocalDateTime.now();
+ WorkOrder wo = new WorkOrder(1, 2, "Note", now);
+ assertEquals(1, wo.getId());
+ assertEquals(2, wo.getVehicleId());
+ assertEquals("Note", wo.getNote());
+ assertEquals(now, wo.getCreatedAt());
+ }
+}
diff --git a/src/test/java/de/antco/projekt/service/WorkshopServiceTest.java b/src/test/java/de/antco/projekt/service/WorkshopServiceTest.java
new file mode 100644
index 0000000..b3ee59e
--- /dev/null
+++ b/src/test/java/de/antco/projekt/service/WorkshopServiceTest.java
@@ -0,0 +1,116 @@
+package de.antco.projekt.service;
+
+import de.antco.projekt.dao.PersonDao;
+import de.antco.projekt.dao.ServiceItemDao;
+import de.antco.projekt.dao.VehicleDao;
+import de.antco.projekt.dao.WorkOrderDao;
+import de.antco.projekt.model.Person;
+import de.antco.projekt.model.ServiceItem;
+import de.antco.projekt.model.Vehicle;
+import de.antco.projekt.model.WorkOrderDetails;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+class WorkshopServiceTest {
+
+ @Mock
+ private PersonDao personDao;
+ @Mock
+ private VehicleDao vehicleDao;
+ @Mock
+ private ServiceItemDao serviceItemDao;
+ @Mock
+ private WorkOrderDao workOrderDao;
+
+ private WorkshopService service;
+
+ @BeforeEach
+ void setUp() {
+ service = new WorkshopService(personDao, vehicleDao, serviceItemDao, workOrderDao);
+ }
+
+ @Test
+ void testCreatePerson() throws SQLException {
+ Person expected = new Person(1, "Name", "123", "a", "b");
+ when(personDao.create("Name", "123", "a", "b")).thenReturn(expected);
+
+ Person actual = service.createPerson("Name", "123", "a", "b");
+ assertEquals(expected, actual);
+ verify(personDao).create("Name", "123", "a", "b");
+ }
+
+ @Test
+ void testListPersons() throws SQLException {
+ List list = Collections.singletonList(new Person(1, "N", "P", "E", "A"));
+ when(personDao.findAll()).thenReturn(list);
+
+ assertEquals(list, service.listPersons());
+ }
+
+ @Test
+ void testCreateVehicle() throws SQLException {
+ Vehicle expected = new Vehicle(1, 1, "B", "M", "P");
+ when(vehicleDao.create(1, "B", "M", "P")).thenReturn(expected);
+
+ assertEquals(expected, service.createVehicle(1, "B", "M", "P"));
+ }
+
+ @Test
+ void testListVehicles() throws SQLException {
+ List list = Collections.emptyList();
+ when(vehicleDao.findByPerson(1)).thenReturn(list);
+
+ assertEquals(list, service.listVehicles(1));
+ }
+
+ @Test
+ void testListServiceItems() throws SQLException {
+ List list = Collections.singletonList(new ServiceItem(1, "T", BigDecimal.TEN));
+ when(serviceItemDao.findAll()).thenReturn(list);
+
+ assertEquals(list, service.listServiceItems());
+ }
+
+ @Test
+ void testCreateWorkOrder() throws SQLException {
+ Map items = Map.of(1, 2);
+ when(workOrderDao.createWorkOrder(10, "Note", items)).thenReturn(55);
+
+ assertEquals(55, service.createWorkOrder(10, "Note", items));
+ }
+
+ @Test
+ void testListWorkOrders() throws SQLException {
+ List list = Collections.emptyList();
+ when(workOrderDao.fetchAllDetails()).thenReturn(list);
+
+ assertEquals(list, service.listWorkOrders());
+ }
+
+ @Test
+ void testFindPerson() throws SQLException {
+ Person p = new Person(1, "N", "P", "E", "A");
+ when(personDao.findById(1)).thenReturn(p);
+ assertEquals(p, service.findPerson(1));
+ }
+
+ @Test
+ void testFindVehicle() throws SQLException {
+ Vehicle v = new Vehicle(1, 1, "B", "M", "P");
+ when(vehicleDao.findById(1)).thenReturn(v);
+ assertEquals(v, service.findVehicle(1));
+ }
+}
diff --git a/target/classes/de/antco/projekt/ConsoleUi.class b/target/classes/de/antco/projekt/ConsoleUi.class
index addd162..8a2c7be 100644
Binary files a/target/classes/de/antco/projekt/ConsoleUi.class and b/target/classes/de/antco/projekt/ConsoleUi.class differ
diff --git a/target/classes/de/antco/projekt/service/WorkshopService.class b/target/classes/de/antco/projekt/service/WorkshopService.class
index bc469e9..0d1a0b9 100644
Binary files a/target/classes/de/antco/projekt/service/WorkshopService.class and b/target/classes/de/antco/projekt/service/WorkshopService.class differ
diff --git a/target/jdbc-konsolen-projekt-1.0-SNAPSHOT-jar-with-dependencies.jar b/target/jdbc-konsolen-projekt-1.0-SNAPSHOT-jar-with-dependencies.jar
deleted file mode 100644
index 06481db..0000000
Binary files a/target/jdbc-konsolen-projekt-1.0-SNAPSHOT-jar-with-dependencies.jar and /dev/null differ
diff --git a/target/jdbc-konsolen-projekt-1.0-SNAPSHOT.jar b/target/jdbc-konsolen-projekt-1.0-SNAPSHOT.jar
deleted file mode 100644
index aaaa41f..0000000
Binary files a/target/jdbc-konsolen-projekt-1.0-SNAPSHOT.jar and /dev/null differ
diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties
deleted file mode 100644
index 73a57c3..0000000
--- a/target/maven-archiver/pom.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#Generated by Maven
-#Thu Dec 11 10:07:13 CET 2025
-artifactId=jdbc-konsolen-projekt
-groupId=de.antco
-version=1.0-SNAPSHOT
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
index 00cf797..808564d 100644
--- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -8,6 +8,7 @@ de/antco/projekt/model/WorkOrderDetails.class
de/antco/projekt/model/WorkOrderItem.class
de/antco/projekt/exporters/IExporter.class
de/antco/projekt/dao/WorkOrderDao.class
+de/antco/projekt/loggers/ILogger.class
de/antco/projekt/dao/ServiceItemDao.class
de/antco/projekt/service/WorkshopService.class
de/antco/projekt/dao/VehicleDao.class
diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
index d434a9e..0a3e4df 100644
--- a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
@@ -1,4 +1,16 @@
-de/antco/projekt/importers/CsvPersonImporterTest.class
+de/antco/projekt/dao/ServiceItemDaoTest.class
+de/antco/projekt/ConsoleUiTest.class
+de/antco/projekt/dao/WorkOrderDaoTest.class
+de/antco/projekt/model/WorkOrderItemTest.class
de/antco/projekt/exporters/CsvPersonExporterTest.class
-de/antco/projekt/model/PersonTest.class
+de/antco/projekt/importers/CsvPersonImporterTest.class
+de/antco/projekt/model/WorkOrderTest.class
+de/antco/projekt/model/ServiceItemTest.class
+de/antco/projekt/model/WorkOrderDetailsTest.class
de/antco/projekt/model/VehicleTest.class
+de/antco/projekt/AppTest.class
+de/antco/projekt/dao/VehicleDaoTest.class
+de/antco/projekt/dao/SchemaCreatorTest.class
+de/antco/projekt/service/WorkshopServiceTest.class
+de/antco/projekt/model/PersonTest.class
+de/antco/projekt/dao/PersonDaoTest.class
diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
index 5c6fd89..842008a 100644
--- a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
@@ -1,4 +1,16 @@
/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/model/VehicleTest.java
-/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/exporters/CsvPersonExporterTest.java
/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/importers/CsvPersonImporterTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/ConsoleUiTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/dao/PersonDaoTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/dao/VehicleDaoTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/model/WorkOrderDetailsTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/model/WorkOrderTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/AppTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/service/WorkshopServiceTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/model/WorkOrderItemTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/exporters/CsvPersonExporterTest.java
/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/model/PersonTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/dao/WorkOrderDaoTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/dao/ServiceItemDaoTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/dao/SchemaCreatorTest.java
+/config/workspace/SchuleB/jdbc_konsolen_projekt/src/test/java/de/antco/projekt/model/ServiceItemTest.java
diff --git a/target/surefire-reports/TEST-de.antco.projekt.exporters.CsvPersonExporterTest.xml b/target/surefire-reports/TEST-de.antco.projekt.exporters.CsvPersonExporterTest.xml
index 493c000..340bfd6 100644
--- a/target/surefire-reports/TEST-de.antco.projekt.exporters.CsvPersonExporterTest.xml
+++ b/target/surefire-reports/TEST-de.antco.projekt.exporters.CsvPersonExporterTest.xml
@@ -1,20 +1,21 @@
-
+
-
+
+
-
+
-
+
@@ -27,7 +28,7 @@
-
+
@@ -53,5 +54,5 @@
-
+
\ No newline at end of file
diff --git a/target/surefire-reports/TEST-de.antco.projekt.importers.CsvPersonImporterTest.xml b/target/surefire-reports/TEST-de.antco.projekt.importers.CsvPersonImporterTest.xml
index e92c96c..8058d9e 100644
--- a/target/surefire-reports/TEST-de.antco.projekt.importers.CsvPersonImporterTest.xml
+++ b/target/surefire-reports/TEST-de.antco.projekt.importers.CsvPersonImporterTest.xml
@@ -1,20 +1,21 @@
-
+
-
+
+
-
+
-
+
@@ -27,7 +28,7 @@
-
+
@@ -53,5 +54,5 @@
-
+
\ No newline at end of file
diff --git a/target/surefire-reports/de.antco.projekt.exporters.CsvPersonExporterTest.txt b/target/surefire-reports/de.antco.projekt.exporters.CsvPersonExporterTest.txt
index 3c984d5..35744c9 100644
--- a/target/surefire-reports/de.antco.projekt.exporters.CsvPersonExporterTest.txt
+++ b/target/surefire-reports/de.antco.projekt.exporters.CsvPersonExporterTest.txt
@@ -1,4 +1,4 @@
-------------------------------------------------------------------------------
Test set: de.antco.projekt.exporters.CsvPersonExporterTest
-------------------------------------------------------------------------------
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.313 s -- in de.antco.projekt.exporters.CsvPersonExporterTest
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.108 s -- in de.antco.projekt.exporters.CsvPersonExporterTest
diff --git a/target/surefire-reports/de.antco.projekt.importers.CsvPersonImporterTest.txt b/target/surefire-reports/de.antco.projekt.importers.CsvPersonImporterTest.txt
index 2390926..45d48e8 100644
--- a/target/surefire-reports/de.antco.projekt.importers.CsvPersonImporterTest.txt
+++ b/target/surefire-reports/de.antco.projekt.importers.CsvPersonImporterTest.txt
@@ -1,4 +1,4 @@
-------------------------------------------------------------------------------
Test set: de.antco.projekt.importers.CsvPersonImporterTest
-------------------------------------------------------------------------------
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 s -- in de.antco.projekt.importers.CsvPersonImporterTest
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s -- in de.antco.projekt.importers.CsvPersonImporterTest