我正在尝试遵循端口和适配器的六边形设计,更具体地说,遵循这种方法: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 = new DynamodbLocalMetadata();
那么有没有办法清理它以便测试可以相同?目前我不确定 DynamodbLocalMetadata 给了我什么,因为代码在本地或服务器上运行时使用 Dynamodbv2Metadata 实现,但它会在单元测试执行时调用 DynamodbLocalMetadata。
任何帮助表示赞赏!