From a70a96980ae0422ba15750dd5714302c73286c25 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Sat, 21 Jun 2025 10:38:57 +0200 Subject: [PATCH] refactor: use custum type to wrap raw map --- .../pcvolkmer/onco/datamapper/ResultSet.java | 82 +++++++++++++++++++ .../pcvolkmer/onco/datamapper/TypeMapper.java | 31 ------- .../datacatalogues/AbstractDataCatalogue.java | 5 +- .../AbstractSubformDataCatalogue.java | 20 +++-- .../datacatalogues/DataCatalogue.java | 4 +- .../datacatalogues/PatientCatalogue.java | 8 +- .../mapper/KpaDiagnosisDataMapper.java | 8 +- .../mapper/KpaPatientDataMapper.java | 20 ++--- .../datamapper/mapper/PatientDataMapper.java | 22 ++--- .../onco/datamapper/ResultSetTest.java | 46 +++++++++++ .../mapper/KpaDiagnosisDataMapperTest.java | 5 +- .../mapper/KpaPatientDataMapperTest.java | 19 ++++- .../mapper/PatientDataMapperTest.java | 19 ++++- 13 files changed, 202 insertions(+), 87 deletions(-) create mode 100644 src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java delete mode 100644 src/main/java/dev/pcvolkmer/onco/datamapper/TypeMapper.java create mode 100644 src/test/java/dev/pcvolkmer/onco/datamapper/ResultSetTest.java diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java b/src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java new file mode 100644 index 0000000..013bc1a --- /dev/null +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java @@ -0,0 +1,82 @@ +package dev.pcvolkmer.onco.datamapper; + +import java.sql.Date; +import java.util.Map; + +/** + * Result set type to wrap Map + * + * @author Paul-Christian Volkmer + * @since 0.1 + */ +public class ResultSet { + + private final Map rawData; + + private ResultSet(final Map rawData) { + this.rawData = rawData; + } + + public static ResultSet from(final Map rawData) { + return new ResultSet(rawData); + } + + public Map getRawData() { + return rawData; + } + + /** + * Get column value as String and cast value if possible + * @param columnName The name of the column + * @return The column value as String + */ + public String getString(String columnName) { + var raw = this.rawData.get(columnName); + + if (raw == null) { + return null; + } else if (raw instanceof String) { + return raw.toString(); + } else if (raw instanceof Integer) { + return ((Integer) raw).toString(); + } + + throw new IllegalArgumentException("Cannot convert " + raw.getClass() + " to String"); + } + + /** + * Get column value as Integer and cast value if possible + * @param columnName The name of the column + * @return The column value as Integer + */ + public Integer getInteger(String columnName) { + var raw = this.rawData.get(columnName); + + if (raw == null) { + return null; + } else if (raw instanceof Integer) { + return ((Integer) raw); + } + + throw new IllegalArgumentException("Cannot convert " + raw.getClass() + " to Integer"); + } + + /** + * Get column value as Date and cast value if possible + * @param columnName The name of the column + * @return The column value as Date + */ + public Date getDate(String columnName) { + var raw = this.rawData.get(columnName); + + if (raw == null) { + return null; + } + if (raw instanceof Date) { + return (Date) raw; + } + + throw new IllegalArgumentException("Cannot convert " + raw.getClass() + " to Date"); + } + +} diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/TypeMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/TypeMapper.java deleted file mode 100644 index b99bfe0..0000000 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/TypeMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.pcvolkmer.onco.datamapper; - -import java.sql.Date; - -public class TypeMapper { - - public static String asString(Object raw) { - if (raw == null) { - return null; - } - if (raw instanceof String) { - return (String) raw; - } else if (raw instanceof Integer) { - return ((Integer) raw).toString(); - } - - throw new IllegalArgumentException("Cannot convert " + raw.getClass() + " to String"); - } - - public static Date asDate(Object raw) { - if (raw == null) { - return null; - } - if (raw instanceof Date) { - return (Date) raw; - } - - throw new IllegalArgumentException("Cannot convert " + raw.getClass() + " to Date"); - } - -} diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java index 533859b..a500125 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java @@ -1,5 +1,6 @@ package dev.pcvolkmer.onco.datamapper.datacatalogues; +import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -28,7 +29,7 @@ public abstract class AbstractDataCatalogue implements DataCatalogue { * @return The procedure id */ @Override - public Map getById(int id) { + public ResultSet getById(int id) { var result = this.jdbcTemplate.queryForList( String.format( "SELECT * FROM %s JOIN prozedur ON (prozedur.id = %s.id) WHERE geloescht = 0 AND prozedur.id = ?", @@ -43,7 +44,7 @@ public abstract class AbstractDataCatalogue implements DataCatalogue { throw new DataAccessException("Multiple records found for id: " + id); } - return result.get(0); + return ResultSet.from(result.get(0)); } } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractSubformDataCatalogue.java b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractSubformDataCatalogue.java index eb7dd02..581a72b 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractSubformDataCatalogue.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractSubformDataCatalogue.java @@ -1,9 +1,10 @@ package dev.pcvolkmer.onco.datamapper.datacatalogues; +import dev.pcvolkmer.onco.datamapper.ResultSet; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; -import java.util.Map; +import java.util.stream.Collectors; /** * Common implementations for all data catalogues used in subforms @@ -25,14 +26,17 @@ public abstract class AbstractSubformDataCatalogue extends AbstractDataCatalogue * @param id The procedure id * @return The procedure id */ - public List> getAllByMainId(int id) { + public List getAllByMainId(int id) { return this.jdbcTemplate.queryForList( - String.format( - "SELECT * FROM %s JOIN prozedur ON (prozedur.id = %s.id) WHERE geloescht = 0 AND hauptprozedur_id = ?", - getTableName(), - getTableName() - ), - id); + String.format( + "SELECT * FROM %s JOIN prozedur ON (prozedur.id = %s.id) WHERE geloescht = 0 AND hauptprozedur_id = ?", + getTableName(), + getTableName() + ), + id) + .stream() + .map(ResultSet::from) + .collect(Collectors.toList()); } } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/DataCatalogue.java b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/DataCatalogue.java index 4b1610d..adc5bd3 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/DataCatalogue.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/DataCatalogue.java @@ -1,6 +1,6 @@ package dev.pcvolkmer.onco.datamapper.datacatalogues; -import java.util.Map; +import dev.pcvolkmer.onco.datamapper.ResultSet; /** * Common interface for all data catalogues @@ -15,6 +15,6 @@ public interface DataCatalogue { * @param id The database id (primary key) * @return The result set */ - Map getById(int id); + ResultSet getById(int id); } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/PatientCatalogue.java b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/PatientCatalogue.java index 1021321..5c3f15b 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/PatientCatalogue.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/PatientCatalogue.java @@ -1,10 +1,9 @@ package dev.pcvolkmer.onco.datamapper.datacatalogues; +import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; -import java.util.Map; - /** * Load raw result sets from database table 'patient' * @@ -25,11 +24,12 @@ public class PatientCatalogue implements DataCatalogue { /** * Get patient result set by procedure id + * * @param id The procedure id * @return The procedure id */ @Override - public Map getById(int id) { + public ResultSet getById(int id) { var result = this.jdbcTemplate.queryForList( "SELECT * FROM patient WHERE id = ?", @@ -41,7 +41,7 @@ public class PatientCatalogue implements DataCatalogue { throw new DataAccessException("Multiple patient records found for id: " + id); } - return result.get(0); + return ResultSet.from(result.get(0)); } } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapper.java index 9c23dfb..fb01bb9 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapper.java @@ -4,8 +4,6 @@ import dev.pcvolkmer.mv64e.mtb.Coding; import dev.pcvolkmer.mv64e.mtb.MtbDiagnosis; import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; -import static dev.pcvolkmer.onco.datamapper.TypeMapper.asString; - /** * Mapper class to load and map diagnosis data from database table 'dk_dnpm_kpa' * @@ -30,12 +28,12 @@ public class KpaDiagnosisDataMapper implements DataMapper { public MtbDiagnosis getById(int id) { var data = kpaCatalogue.getById(id); - var builder = MtbDiagnosis.builder(); + var builder = MtbDiagnosis.builder(); builder - .id(asString(data.get("id"))) + .id(data.getString("id")) .code( Coding.builder() - .code(asString(data.get("icd10"))) + .code(data.getString("icd10")) .build() ); return builder.build(); diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java index e818520..f3373a6 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java @@ -1,13 +1,9 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.*; +import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; -import java.util.Map; - -import static dev.pcvolkmer.onco.datamapper.TypeMapper.asDate; -import static dev.pcvolkmer.onco.datamapper.TypeMapper.asString; - /** * Mapper class to load and map patient data from database table 'dk_dnpm_kpa' * @@ -34,18 +30,18 @@ public class KpaPatientDataMapper implements DataMapper { var builder = Patient.builder(); builder - .id(asString(kpaData.get("patient_id"))) + .id(kpaData.getString("patient_id")) .gender(getGenderCoding(kpaData)) - .birthDate(mapDate(asDate(kpaData.get("geburtsdatum")))) - .dateOfDeath(mapDate(asDate(kpaData.get("todesdatum")))) + .birthDate(mapDate(kpaData.getDate("geburtsdatum"))) + .dateOfDeath(mapDate(kpaData.getDate("todesdatum"))) .healthInsurance(getHealthInsurance(kpaData)) ; return builder.build(); } - private GenderCoding getGenderCoding(Map data) { + private GenderCoding getGenderCoding(ResultSet data) { var genderCodingBuilder = GenderCoding.builder(); - String geschlecht = asString(data.get("geschlecht")); + String geschlecht = data.getString("geschlecht"); switch (geschlecht) { case "m": genderCodingBuilder.code(GenderCodingCode.MALE); @@ -63,9 +59,9 @@ public class KpaPatientDataMapper implements DataMapper { return genderCodingBuilder.build(); } - private HealthInsurance getHealthInsurance(Map data) { + private HealthInsurance getHealthInsurance(ResultSet data) { var healthInsuranceCodingBuilder = HealthInsuranceCoding.builder(); - String healthInsuranceType = asString(data.get("artderkrankenkasse")); + String healthInsuranceType = data.getString("artderkrankenkasse"); if (healthInsuranceType == null) { healthInsuranceCodingBuilder.code(HealthInsuranceCodingCode.UNK).build(); return HealthInsurance.builder().type(healthInsuranceCodingBuilder.build()).build(); diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java index 557e3c1..a7e01b3 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java @@ -4,14 +4,10 @@ import dev.pcvolkmer.mv64e.mtb.Address; import dev.pcvolkmer.mv64e.mtb.GenderCoding; import dev.pcvolkmer.mv64e.mtb.GenderCodingCode; import dev.pcvolkmer.mv64e.mtb.Patient; +import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.PatientCatalogue; import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; -import java.util.Map; - -import static dev.pcvolkmer.onco.datamapper.TypeMapper.asDate; -import static dev.pcvolkmer.onco.datamapper.TypeMapper.asString; - /** * Mapper class to load and map diagnosis data from database table 'dk_dnpm_kpa' * @@ -33,23 +29,23 @@ public class PatientDataMapper implements DataMapper { * @return The loaded MtbDiagnosis file */ @Override - public Patient getById(int id) { + public Patient getById(final int id) { var patientData = patientCatalogue.getById(id); var builder = Patient.builder(); builder - .id(asString(patientData.get("id"))) + .id(patientData.getString("id")) .gender(getGenderCoding(patientData)) - .birthDate(mapDate(asDate(patientData.get("geburtsdatum")))) - .dateOfDeath(mapDate(asDate(patientData.get("sterbedatum")))) + .birthDate(mapDate(patientData.getDate("geburtsdatum"))) + .dateOfDeath(mapDate(patientData.getDate("sterbedatum"))) .address(Address.builder().municipalityCode(getMunicipalityCode(patientData)).build()) ; return builder.build(); } - private GenderCoding getGenderCoding(Map data) { + private GenderCoding getGenderCoding(final ResultSet data) { var genderCodingBuilder = GenderCoding.builder(); - String geschlecht = asString(data.get("geschlecht")); + String geschlecht = data.getString("geschlecht"); switch (geschlecht) { case "M": genderCodingBuilder.code(GenderCodingCode.MALE); @@ -66,8 +62,8 @@ public class PatientDataMapper implements DataMapper { return genderCodingBuilder.build(); } - private String getMunicipalityCode(Map data) { - var gkz = asString(data.get("GKZ")); + private String getMunicipalityCode(final ResultSet data) { + var gkz = data.getString("GKZ"); if (gkz == null || gkz.trim().length() != 8) { throw new DataAccessException("Municipality code not found"); } diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/ResultSetTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/ResultSetTest.java new file mode 100644 index 0000000..f8c0deb --- /dev/null +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/ResultSetTest.java @@ -0,0 +1,46 @@ +package dev.pcvolkmer.onco.datamapper; + +import org.junit.jupiter.api.Test; + +import java.time.Instant; +import java.sql.Date; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class ResultSetTest { + + @Test + void shouldReturnStringValues() { + var data = getTestData(); + + assertThat(data.getString("null")).isNull(); + assertThat(data.getString("string")).isEqualTo("TestString"); + assertThat(data.getString("int")).isEqualTo("42"); + } + + @Test + void shouldReturnIntegerValues() { + var data = getTestData(); + + assertThat(data.getInteger("int")).isEqualTo(42); + } + + @Test + void shouldReturnDateValues() { + var data = getTestData(); + + assertThat(data.getDate("date")).isEqualTo(new Date(Date.from(Instant.parse("2025-06-21T12:00:00Z")).getTime())); + } + + static ResultSet getTestData() { + return ResultSet.from( + Map.of( + "string", "TestString", + "int", 42, + "date", new Date(Date.from(Instant.parse("2025-06-21T12:00:00Z")).getTime()) + ) + ); + } + +} diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapperTest.java index 1cae4d5..5b6f5c6 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaDiagnosisDataMapperTest.java @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.MtbDiagnosis; +import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -35,11 +36,11 @@ class KpaDiagnosisDataMapperTest { } @Test - void shouldCreateDiagnosis(@Mock Map resultSet) { + void shouldCreateDiagnosis(@Mock ResultSet resultSet) { doAnswer(invocationOnMock -> { var columnName = invocationOnMock.getArgument(0, String.class); return testData().get(columnName); - }).when(resultSet).get(anyString()); + }).when(resultSet).getString(anyString()); doAnswer(invocationOnMock -> resultSet) .when(kpaCatalogue) diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java index a18129f..e0edd30 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.*; +import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -37,7 +38,7 @@ class KpaPatientDataMapperTest { } @Test - void shouldCreatePatientAlive(@Mock Map resultSet) { + void shouldCreatePatientAlive(@Mock ResultSet resultSet) { var testData = Map.of( "patient_id", "1", "geschlecht", "m", @@ -49,7 +50,12 @@ class KpaPatientDataMapperTest { doAnswer(invocationOnMock -> { var columnName = invocationOnMock.getArgument(0, String.class); return testData.get(columnName); - }).when(resultSet).get(anyString()); + }).when(resultSet).getString(anyString()); + + doAnswer(invocationOnMock -> { + var columnName = invocationOnMock.getArgument(0, String.class); + return testData.get(columnName); + }).when(resultSet).getDate(anyString()); doAnswer(invocationOnMock -> resultSet) .when(kpaCatalogue) @@ -67,7 +73,7 @@ class KpaPatientDataMapperTest { } @Test - void shouldCreatePatientDead(@Mock Map resultSet) { + void shouldCreatePatientDead(@Mock ResultSet resultSet) { var testData = Map.of( "patient_id", "1", "geschlecht", "w", @@ -78,7 +84,12 @@ class KpaPatientDataMapperTest { doAnswer(invocationOnMock -> { var columnName = invocationOnMock.getArgument(0, String.class); return testData.get(columnName); - }).when(resultSet).get(anyString()); + }).when(resultSet).getString(anyString()); + + doAnswer(invocationOnMock -> { + var columnName = invocationOnMock.getArgument(0, String.class); + return testData.get(columnName); + }).when(resultSet).getDate(anyString()); doAnswer(invocationOnMock -> resultSet) .when(kpaCatalogue) diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapperTest.java index 9792cd2..b1a4869 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapperTest.java @@ -3,6 +3,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.Address; import dev.pcvolkmer.mv64e.mtb.GenderCodingCode; import dev.pcvolkmer.mv64e.mtb.Patient; +import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.PatientCatalogue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -39,7 +40,7 @@ class PatientDataMapperTest { } @Test - void shouldCreatePatientAlive(@Mock Map resultSet) { + void shouldCreatePatientAlive(@Mock ResultSet resultSet) { var testData = Map.of( "id", "1", "geschlecht", "M", @@ -51,7 +52,12 @@ class PatientDataMapperTest { doAnswer(invocationOnMock -> { var columnName = invocationOnMock.getArgument(0, String.class); return testData.get(columnName); - }).when(resultSet).get(anyString()); + }).when(resultSet).getString(anyString()); + + doAnswer(invocationOnMock -> { + var columnName = invocationOnMock.getArgument(0, String.class); + return testData.get(columnName); + }).when(resultSet).getDate(anyString()); doAnswer(invocationOnMock -> resultSet) .when(patientCatalogue) @@ -67,7 +73,7 @@ class PatientDataMapperTest { } @Test - void shouldCreatePatientDead(@Mock Map resultSet) { + void shouldCreatePatientDead(@Mock ResultSet resultSet) { var testData = Map.of( "id", "1", "geschlecht", "M", @@ -78,7 +84,12 @@ class PatientDataMapperTest { doAnswer(invocationOnMock -> { var columnName = invocationOnMock.getArgument(0, String.class); return testData.get(columnName); - }).when(resultSet).get(anyString()); + }).when(resultSet).getString(anyString()); + + doAnswer(invocationOnMock -> { + var columnName = invocationOnMock.getArgument(0, String.class); + return testData.get(columnName); + }).when(resultSet).getDate(anyString()); doAnswer(invocationOnMock -> resultSet) .when(patientCatalogue)