【问题标题】:Confused on how to write a simulator对如何编写模拟器感到困惑
【发布时间】:2020-05-06 11:53:00
【问题描述】:

我正在尝试遵循端口和适配器的六边形设计,更具体地说,遵循这种方法: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 = new Dynamodbv2Metadata(); 对比 元数据 metadata = new DynamodbLocalMetadata();

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

感谢任何帮助!

【问题讨论】:

    标签: java hexagonal-architecture


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2014-11-27
      • 2022-01-04
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多