Я пытаюсь следовать шестиугольной конструкции портов и адаптеров, а точнее следую этому подходу: https://docs.microsoft.com/en-us/archive/blogs/ericgu/unit-test-success-using-ports-adapters-simulatorskata-walkthrough и https://docs.microsoft.com/en-us/archive/blogs/ericgu/unit-test-success-using-ports-adapters-and-simulators.
Основной идея в том, что я не хотел имитировать свое использование Dynamodb, а создал для него адаптер.
Учитывая интерфейс:
public interface Metadata {
JsonNode getMetadata(String metadataName, String metadataVersion);
}
И создал две реализации. Этот фактически использует базу данных:
public enum Dynamodbv2Metadata implements Metadata {
INSTANCE;
private AmazonDynamoDB ddb;
private Dynamodbv2Metadata() {
ddb = AmazonDynamoDBClientBuilder.defaultClient();
}
@Override
public JsonNode getMetadata(String metadataName, String metadataVersion) {
//business logic
}
}
В то время как этот использует решение в памяти, известное как DynamodbLocal:
public class DynamodbLocalMetadata implements Metadata {
static ObjectMapper mapper = new ObjectMapper();
AmazonDynamoDB dynamodb;
String tableName;
String partitionKey;
DynamodbLocalMetadata(String tableName, String hashKeyName, JsonNode dynamodbItem) {
this.tableName = tableName;
this.partitionKey = hashKeyName;
dynamodb = DynamoDBEmbedded.create().amazonDynamoDB();
// This is here to populate the in-memory database with the records to be tested.
CreateTableResult res = createTable(dynamodb, tableName, hashKeyName);
createItem(tableName, dynamodbItem);
}
@Override
public JsonNode getMetadata(String metadataName, String metadataVersion) {
}
}
Но моя путаница заключается в использование тренажера. Идея, похоже, состоит в том, что я могу создать тест, который будет работать на обоих интерфейсах, и теоретически я могу, но инициализация будет таковой: Metadata metadata = new Dynamodbv2Metadata (); vs Metadata metadata = new DynamodbLocalMetadata ();
Итак, есть ли способ очистить это, чтобы тесты могли быть одинаковыми? На данный момент я не уверен, что мне дает DynamodbLocalMetadata, поскольку код использует реализацию Dynamodbv2Metadata при работе локально или на сервере, но он будет вызывать DynamodbLocalMetadata во время выполнения модульных тестов.
Любая помощь приветствуется !