1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 11:59:35 +01:00

refactor(inventory): UnitOfWork-Pattern + JdbcClient-Migration

Letzter BC migriert: JPA/Hibernate durch JdbcClient ersetzt,
@Transactional durch UnitOfWork-Pattern in allen schreibenden Use Cases.

- 3 neue Jdbc-Repos: JdbcStorageLocationRepository, JdbcStockMovementRepository,
  JdbcStockRepository (4-Tabellen-Aggregat mit Batches, Reservations, Allocations)
- 20 Use Cases angepasst (UoW für schreibende, @Transactional entfernt für lesende)
- 15 alte JPA-Dateien gelöscht (6 Entities, 3 Mapper, 3 Adapter, 3 Spring Data Repos)
- 9 Unit-Tests mit UoW-Mock-Pattern aktualisiert
This commit is contained in:
Sebastian Frick 2026-02-25 12:57:46 +01:00
parent c89ee359d1
commit d4ac8cb1b9
48 changed files with 1024 additions and 1388 deletions

View file

@ -6,6 +6,7 @@ import de.effigenix.shared.common.Quantity;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.common.UnitOfMeasure;
import de.effigenix.shared.persistence.UnitOfWork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@ -28,6 +29,7 @@ import static org.mockito.Mockito.*;
class AddStockBatchTest {
@Mock private StockRepository stockRepository;
@Mock private UnitOfWork unitOfWork;
private AddStockBatch addStockBatch;
private AddStockBatchCommand validCommand;
@ -35,7 +37,8 @@ class AddStockBatchTest {
@BeforeEach
void setUp() {
addStockBatch = new AddStockBatch(stockRepository);
addStockBatch = new AddStockBatch(stockRepository, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
existingStock = Stock.reconstitute(
StockId.of("stock-1"),

View file

@ -7,6 +7,7 @@ import de.effigenix.shared.common.Quantity;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.common.UnitOfMeasure;
import de.effigenix.shared.persistence.UnitOfWork;
import de.effigenix.shared.security.ActorId;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@ -32,6 +33,7 @@ class BlockStockBatchTest {
@Mock private StockRepository stockRepository;
@Mock private AuditLogger auditLogger;
@Mock private UnitOfWork unitOfWork;
private BlockStockBatch blockStockBatch;
private StockBatchId batchId;
@ -41,7 +43,8 @@ class BlockStockBatchTest {
@BeforeEach
void setUp() {
blockStockBatch = new BlockStockBatch(stockRepository, auditLogger);
blockStockBatch = new BlockStockBatch(stockRepository, auditLogger, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
batchId = StockBatchId.of("batch-1");
var batch = StockBatch.reconstitute(

View file

@ -4,6 +4,7 @@ import de.effigenix.domain.inventory.*;
import de.effigenix.domain.masterdata.ArticleId;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.persistence.UnitOfWork;
import de.effigenix.shared.security.ActorId;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@ -17,9 +18,8 @@ import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.lenient;
@ExtendWith(MockitoExtension.class)
@DisplayName("DeactivateStorageLocation Use Case")
@ -27,13 +27,15 @@ class DeactivateStorageLocationTest {
@Mock private StorageLocationRepository storageLocationRepository;
@Mock private StockRepository stockRepository;
@Mock private UnitOfWork unitOfWork;
private DeactivateStorageLocation deactivateStorageLocation;
private ActorId performedBy;
@BeforeEach
void setUp() {
deactivateStorageLocation = new DeactivateStorageLocation(storageLocationRepository, stockRepository);
deactivateStorageLocation = new DeactivateStorageLocation(storageLocationRepository, stockRepository, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
performedBy = ActorId.of("admin-user");
}

View file

@ -4,6 +4,7 @@ import de.effigenix.application.inventory.command.RecordStockMovementCommand;
import de.effigenix.domain.inventory.*;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.persistence.UnitOfWork;
import de.effigenix.shared.security.ActorId;
import de.effigenix.shared.security.AuthorizationPort;
import org.junit.jupiter.api.BeforeEach;
@ -19,6 +20,7 @@ class RecordStockMovementTest {
private StockMovementRepository repository;
private AuthorizationPort authPort;
private UnitOfWork unitOfWork;
private RecordStockMovement useCase;
private final ActorId actor = ActorId.of("user-1");
@ -26,7 +28,9 @@ class RecordStockMovementTest {
void setUp() {
repository = mock(StockMovementRepository.class);
authPort = mock(AuthorizationPort.class);
useCase = new RecordStockMovement(repository, authPort);
unitOfWork = mock(UnitOfWork.class);
useCase = new RecordStockMovement(repository, authPort, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
when(authPort.can(any(ActorId.class), any())).thenReturn(true);
}

View file

@ -6,6 +6,7 @@ import de.effigenix.shared.common.Quantity;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.common.UnitOfMeasure;
import de.effigenix.shared.persistence.UnitOfWork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@ -29,6 +30,7 @@ import static org.mockito.Mockito.*;
class ReleaseReservationTest {
@Mock private StockRepository stockRepository;
@Mock private UnitOfWork unitOfWork;
private ReleaseReservation releaseReservation;
private Stock existingStock;
@ -36,7 +38,8 @@ class ReleaseReservationTest {
@BeforeEach
void setUp() {
releaseReservation = new ReleaseReservation(stockRepository);
releaseReservation = new ReleaseReservation(stockRepository, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
var batch = StockBatch.reconstitute(
StockBatchId.generate(),

View file

@ -6,6 +6,7 @@ import de.effigenix.shared.common.Quantity;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.common.UnitOfMeasure;
import de.effigenix.shared.persistence.UnitOfWork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@ -29,6 +30,7 @@ import static org.mockito.Mockito.*;
class RemoveStockBatchTest {
@Mock private StockRepository stockRepository;
@Mock private UnitOfWork unitOfWork;
private RemoveStockBatch removeStockBatch;
private StockBatchId batchId;
@ -37,7 +39,8 @@ class RemoveStockBatchTest {
@BeforeEach
void setUp() {
removeStockBatch = new RemoveStockBatch(stockRepository);
removeStockBatch = new RemoveStockBatch(stockRepository, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
batchId = StockBatchId.of("batch-1");
var batch = StockBatch.reconstitute(

View file

@ -6,6 +6,7 @@ import de.effigenix.shared.common.Quantity;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.common.UnitOfMeasure;
import de.effigenix.shared.persistence.UnitOfWork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@ -29,6 +30,7 @@ import static org.mockito.Mockito.*;
class ReserveStockTest {
@Mock private StockRepository stockRepository;
@Mock private UnitOfWork unitOfWork;
private ReserveStock reserveStock;
private ReserveStockCommand validCommand;
@ -36,7 +38,8 @@ class ReserveStockTest {
@BeforeEach
void setUp() {
reserveStock = new ReserveStock(stockRepository);
reserveStock = new ReserveStock(stockRepository, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
var batch = StockBatch.reconstitute(
StockBatchId.generate(),

View file

@ -7,6 +7,7 @@ import de.effigenix.shared.common.Quantity;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.common.UnitOfMeasure;
import de.effigenix.shared.persistence.UnitOfWork;
import de.effigenix.shared.security.ActorId;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@ -32,6 +33,7 @@ class UnblockStockBatchTest {
@Mock private StockRepository stockRepository;
@Mock private AuditLogger auditLogger;
@Mock private UnitOfWork unitOfWork;
private UnblockStockBatch unblockStockBatch;
private StockBatchId batchId;
@ -41,7 +43,8 @@ class UnblockStockBatchTest {
@BeforeEach
void setUp() {
unblockStockBatch = new UnblockStockBatch(stockRepository, auditLogger);
unblockStockBatch = new UnblockStockBatch(stockRepository, auditLogger, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
batchId = StockBatchId.of("batch-1");
var batch = StockBatch.reconstitute(

View file

@ -5,6 +5,7 @@ import de.effigenix.domain.inventory.*;
import de.effigenix.shared.common.RepositoryError;
import de.effigenix.shared.common.Result;
import de.effigenix.shared.common.UnitOfMeasure;
import de.effigenix.shared.persistence.UnitOfWork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@ -18,19 +19,22 @@ import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.lenient;
@ExtendWith(MockitoExtension.class)
@DisplayName("UpdateStock Use Case")
class UpdateStockTest {
@Mock private StockRepository stockRepository;
@Mock private UnitOfWork unitOfWork;
private UpdateStock updateStock;
private Stock existingStock;
@BeforeEach
void setUp() {
updateStock = new UpdateStock(stockRepository);
updateStock = new UpdateStock(stockRepository, unitOfWork);
lenient().when(unitOfWork.executeAtomically(any())).thenAnswer(inv -> ((java.util.function.Supplier<?>) inv.getArgument(0)).get());
existingStock = Stock.reconstitute(
StockId.of("stock-1"),