0

我正在尝试遵循端口和适配器的六边形设计,更具体地说,遵循这种方法:https ://docs.microsoft.com/en-us/archive/blogs/ericgu/unit-test-success-using-ports-adapters -simulatorskata-walkthroughhttps://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 = new DynamodbLocalMetadata();

那么有没有办法清理它以便测试可以相同?目前我不确定 DynamodbLocalMetadata 给了我什么,因为代码在本地或服务器上运行时使用 Dynamodbv2Metadata 实现,但它会在单元测试执行时调用 DynamodbLocalMetadata。

任何帮助表示赞赏!

4

1 回答 1

1

关键是只有一个类实现您的接口“MetaData”。该类将包含业务逻辑,并且将依赖于数据库接口(它将 db 接口作为构造函数参数)。

您应该创建 db 接口的 2 个实现:一个用于真实数据库,另一个用于内存数据库。

然后在运行应用程序时,您在业务逻辑类中注入其中一个或另一个。

于 2020-05-08T06:16:39.797 回答