diff --git a/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java b/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java index 616293d82d85a57a14e32296f415019571370782..9644711cdffdb539fb59487ac2e8e2a8a92f049e 100644 --- a/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java +++ b/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java @@ -79,7 +79,7 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema } FormData processFachnachricht(FormData formData) { - return pipe( + return chainWithCaughtRuntimeException( Stream.of( this::addFormName, this::addFormEngineName, @@ -90,9 +90,18 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema ).apply(formData); } - private UnaryOperator<FormData> pipe(Stream<UnaryOperator<FormData>> functions) { - return (formData) -> functions - .reduce(formData, (acc, f) -> f.apply(acc), (a, b) -> a); + private UnaryOperator<FormData> chainWithCaughtRuntimeException(Stream<UnaryOperator<FormData>> functions) { + return formData -> functions + .reduce(formData, this::applyWithCaughtRuntimeException, (a, b) -> a); + } + + private FormData applyWithCaughtRuntimeException(FormData oldFormData, UnaryOperator<FormData> function) { + try { + return function.apply(oldFormData); + } catch (RuntimeException e) { + LOG.error("Error in processing Fachnachricht", e); + return oldFormData; + } } FormData addFormId(FormData formData) { diff --git a/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java b/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java index 1ef26cff3a5579542e25035d85184a371feab718..6dc92dd64e09abb15b9e2d73807ed544586d2c2f 100644 --- a/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java +++ b/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java @@ -180,20 +180,98 @@ class DFoerdermittelEngineBasedSemantikAdapterTest { @Mock FormData formData5; - @BeforeEach - void mock() { - doReturn(formData1).when(adapter).addFormName(formData0); - doReturn(formData2).when(adapter).addFormEngineName(formData1); - doReturn(formData3).when(adapter).addServiceKonto(formData2); - doReturn(formData4).when(adapter).addOrganisationsEinheitId(formData3); - doReturn(formData5).when(adapter).addFormId(formData4); + @DisplayName("without exception") + @Nested + class TestWithoutException { + + @BeforeEach + void mock() { + doReturn(formData1).when(adapter).addFormName(any()); + doReturn(formData2).when(adapter).addFormEngineName(any()); + doReturn(formData3).when(adapter).addServiceKonto(any()); + doReturn(formData4).when(adapter).addOrganisationsEinheitId(any()); + doReturn(formData5).when(adapter).addFormId(any()); + } + + @DisplayName("should call addFromName") + @Test + void shouldCallAddFromName() { + processFachnachricht(); + + verify(adapter).addFormName(formData0); + } + + @DisplayName("should call addFormEngineName") + @Test + void shouldCallAddFormEngineName() { + processFachnachricht(); + + verify(adapter).addFormEngineName(formData1); + } + + @DisplayName("should call addServiceKonto") + @Test + void shouldCallAddServiceKonto() { + processFachnachricht(); + + verify(adapter).addServiceKonto(formData2); + } + + @DisplayName("should call addOrganisationsEinheitId") + @Test + void shouldCallAddOrganisationsEinheitId() { + processFachnachricht(); + + verify(adapter).addOrganisationsEinheitId(formData3); + } + + @DisplayName("should call addFormId") + @Test + void shouldCallAddFormId() { + processFachnachricht(); + + verify(adapter).addFormId(formData4); + } + + @Test + void shouldReturn() { + var processedFormData = processFachnachricht(); + + assertThat(processedFormData).isEqualTo(formData5); + } } - @Test - void shouldReturn() { - var processedFormData = adapter.processFachnachricht(formData0); + @DisplayName("with exception") + @Nested + class TestWithException { + + @BeforeEach + void mock() { + doThrow(new RuntimeException()).when(adapter).addFormName(any()); + doThrow(new RuntimeException()).when(adapter).addFormEngineName(any()); + doThrow(new RuntimeException()).when(adapter).addServiceKonto(any()); + doReturn(formData3).when(adapter).addOrganisationsEinheitId(any()); + doThrow(new RuntimeException()).when(adapter).addFormId(any()); + } + + @DisplayName("should call addOrganisationsEinheitId") + @Test + void shouldCallAddOrganisationsEinheitId() { + processFachnachricht(); + + verify(adapter).addOrganisationsEinheitId(formData0); + } + + @Test + void shouldReturn() { + var processedFormData = processFachnachricht(); + + assertThat(processedFormData).isEqualTo(formData3); + } + } - assertThat(processedFormData).isEqualTo(formData5); + FormData processFachnachricht() { + return adapter.processFachnachricht(formData0); } }