Java 인터페이스가 끔찍하지 않은 이유(단순히 엄격함)
결론은 이것입니다. 인터페이스가 있습니다:
public interface DynamoImpl {
public PutItemResult putItem(PutItemRequest putItemRequest);
public GetItemResult getItem(GetItemRequest getItemRequest);
}
그리고 클래스
AmazonDynamoDB
가 있습니다. 이 클래스에는 위의 두 가지 메서드가 있지만 훨씬 더 많습니다. 이제 프로그래머인 John은 AmazonDynamoDB
의 이 두 메서드만 나머지 프로그램에 노출하려고 합니다. 수업에서 사용하려고 합니다Database
.public class Database {
public DynamoImpl db;
// code removed for simplicity
public Database(DynamoImpl db) {
this.db = db;
}
}
현재: 덕 타이핑을 지원하는 언어에서는 클래스
AmazonDynamoDB
의 인스턴스를 생성자에 전달하고 두 메서드를 호출할 수 있습니다(클래스에 메서드가 있기 때문). 그러나 Java에서는 그렇지 않습니다. 문자 그대로 implements
인터페이스(또는 그렇게 하는 클래스를 확장)인 클래스의 인스턴스를 전달해야 합니다. 그러나 DynamoImpl
는 해당 인터페이스를 구현하지 않습니다.Java에서 동일한 목표를 달성하는 가장 쉬운 방법은
AmazonDynamoDB
인스턴스에 위임하는 래퍼를 만드는 것입니다.public class AmazonDynamoDbWrapper implements DynamoImpl{
private AmazonDynamoDB amazonDynamoDB;
public AmazonDynamoDbWrapper(AmazonDynamoDB amazonDynamoDB) {
this.amazonDynamoDB = amazonDynamoDB;
}
@Override
public PutItemResult putItem(PutItemRequest putItemRequest) {
return amazonDynamoDB.putItem(putItemRequest);
}
@Override
public GetItemResult getItem(GetItemRequest getItemRequest) {
return amazonDynamoDB.getItem(getItemRequest);
}
}
예, 약간 장황하지만 패턴을 이해하면 매우 간단합니다. 이제 이 클래스의 인스턴스를
AmazonDynamoDB
의 인스턴스로 전달할 수 있습니다.프로덕션 코드는 이 정도입니다. 테스트는 어떻습니까?
가장 쉬운 솔루션은 다음과 같이
Database
인터페이스의 최소 구현을 제공하는 것입니다.public class StubbedDynamoImpl implements DynamoImpl {
@Override
public PutItemResult putItem(PutItemRequest putItemRequest) {
return new PutItemResult(/* Test data here */);
}
@Override
public GetItemResult getItem(GetItemRequest getItemRequest) {
return new GetItemResult(/* Test data here */);
}
}
다시 한 번 테스트에서 이 클래스의 인스턴스를
DynamoImpl
인스턴스의 생성자에 전달할 수 있습니다.public class DatabaseTest {
@Test
public void createsDatabase() {
Database database = new Database(new StubbedDynamoImpl());
// Whatever your test assertions are, here
}
// ...
}
노출하려는 모든 것이 두 가지 방법인 경우 멋진 모의 프레임워크가 필요하지 않습니다.
이것이 내가 생각할 수 있는 가장 쉬운 해결책입니다. 유용하길 바랍니다.
추신
Java 규칙에 관한 한 마디: 인터페이스에 접미사 Impl을 사용하지 마십시오. 이것은 구체적인 구현 클래스(있는 경우)에 사용해야 합니다. 그렇지 않으면 많은 사람들이 혼동할 수 있습니다.
Reference
이 문제에 관하여(Java 인터페이스가 끔찍하지 않은 이유(단순히 엄격함)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bertilmuth/why-java-interfaces-arent-terrible-just-strict-3de2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)