Запутался в том, как написать симулятор - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь следовать шестиугольной конструкции портов и адаптеров, а точнее следую этому подходу: 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 во время выполнения модульных тестов.

Любая помощь приветствуется !

1 Ответ

1 голос
/ 08 мая 2020

Дело в том, чтобы иметь просто класс, реализующий ваш интерфейс «MetaData». Этот класс будет содержать бизнес-лог c и будет зависеть от интерфейса базы данных (он будет принимать интерфейс db в качестве параметра конструктора).

Вы должны создать 2 реализации интерфейса db: одну для реальный db, а другой для db в памяти.

Затем при запуске приложения вы вводите либо тот, либо другой в бизнес-лог c class.

...