【发布时间】:2020-05-06 11:53:00
【问题描述】:
我正在尝试遵循端口和适配器的六边形设计,更具体地说,遵循这种方法: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 = new Dynamodbv2Metadata(); 对比 元数据 metadata = new DynamodbLocalMetadata();
那么有没有办法清理它以便测试可以相同?目前我不确定 DynamodbLocalMetadata 给了我什么,因为代码在本地或服务器上运行时使用 Dynamodbv2Metadata 实现,但它会在单元测试执行时调用 DynamodbLocalMetadata。
感谢任何帮助!
【问题讨论】:
标签: java hexagonal-architecture