Java 開発者にとっての春の病
14406 ワード
これは、匿名のスプリング開発者がかつて言ったことです😅:
Spring フレームワークを使用して任意の Java コードベースで作業したことがある場合は、わずかな変更で回避できるいくつかの依存関係を持つクラスを見つけたことがあるかもしれません.次の例で見てみましょう.
ここで私の主張が理解できるかどうかわかりませんが、なぜ AccountAdapterTranslator クラスがコンポーネントになるのでしょうか?
春の病気にかかった Java 開発者によるクラス AccountAdapter の単体テストがどのようになるかを見てみましょう.
すべてのクラスを @Bean または @Component として作成して、Spring 方式ですべてを行う必要はありません.あなたは Java 開発者であり、日常業務を行うためのより良い方法があります.
言語構造を使用してください.仕事をすることができる静的メソッド、静的クラスがあります.たとえば、次のようなリファクタリングが考えられます.
AccountAdapterTranslator は @Bean または @Component ではなく、そうである必要もありません.静的メソッドを持つクラスだけで十分です.テスト目的でモックを作成する必要はありません.メソッドの実行を完了するだけです.
これらのいくつかは、開発者が自動的に行う傾向があるために発生します.熟考することは、機能を開発するときにできる最善を尽くすための優れた戦略です.
仕事をするためのより良い方法は常にあります. Spring 開発者になる前は Java 開発者であり、その前は開発者であり、問題を解決することが仕事であることを忘れないでください.
春の病気についてどう思いますか?春の病気は Java 開発者に他にどのような影響を与えると思いますか?
Everything should be a component.
Spring フレームワークを使用して任意の Java コードベースで作業したことがある場合は、わずかな変更で回避できるいくつかの依存関係を持つクラスを見つけたことがあるかもしれません.次の例で見てみましょう.
In order to do the code less verbose I will use lombok annotations like @AllArgsConstructor
@AllArgsConstructor
@Component
public class AccountAdapter implements AccountPort {
private final RestClient restClient;
private final AccountAdapterTranslator translator;
public Account createAccount(final CreateAccountEntity createAccount) {
CreateAccountRequest request = translator.convertEntityToRequest(createAccount);
Response<CreateAccountResponse> response = restClient.createAccount(request).execute();
return translator.convertResponseToEntity(response);
}
}
@Component
@NoArgsConstructor
public class AccountAdapterTranslator {
public CreateAccountRequest convertEntityToRequest(final CreateAccountEntity createAccount){
return CreateAccountRequest.builder()
.field1(createAccount.getField1())
.field2(createAccount.getField2())
...
.build();
}
public Account convertResponseToEntity(final Response<CreateAccountResponse> response){
return Account.builder()
.fieldX(response.getFieldX())
.fieldY(response.getFieldY())
...
.build();
}
}
ここで私の主張が理解できるかどうかわかりませんが、なぜ AccountAdapterTranslator クラスがコンポーネントになるのでしょうか?
春の病気にかかった Java 開発者によるクラス AccountAdapter の単体テストがどのようになるかを見てみましょう.
@ExtendsWith(MockitoExtension.class)
public class AccountAdapterTest{
@Mock
private RestClient restClient;
@Mock
private AccountAdapterTranslator translator;
@InjectMocks
private AccountAdapter adapter;
@Test
public void testCreateAccountSuccesfully_ShouldReturnAccount(){
//SetUp data
CreateAccountRequest request = CreateAccountRequest.builder().build();
CreateAccountResponse bodyResponse = CreateAccountResponse.builder().build();
RestCall<CreateAccountResponse> restCall = mock(RestCall.class);
Response<CreateAccountResponse> restResponse = Response.success(bodyResponse);
Account account = Account.builder().build();
when(translator.convertEntityToRequest(any())).thenReturn(request);
when(restClient.createAccount(any())).thenReturn(restCall);
when(restCall.execute()).thenReturn(restResponse );
when(translator.convertResponseToEntity(any())).thenReturn(account);
//Execution
Account result = adapter.createAccount(request);
//Assertions
assertEquals(result, account);
}
}
Oh God! 🤦 ¡Kill me now!
すべてのクラスを @Bean または @Component として作成して、Spring 方式ですべてを行う必要はありません.あなたは Java 開発者であり、日常業務を行うためのより良い方法があります.
言語構造を使用してください.仕事をすることができる静的メソッド、静的クラスがあります.たとえば、次のようなリファクタリングが考えられます.
@AllArgsConstructor
public class AccountAdapter implements AccountPort {
private final RestClient restClient;
public Account createAccount(final CreateAccountEntity createAccount) {
CreateAccountRequest request = AccountAdapterTranslator.convertEntityToRequest(createAccount);
Response<CreateAccountResponse> response = restClient.createAccount(request).execute();
return AccountAdapterTranslator.convertResponseToEntity(response);
}
}
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AccountAdapterTranslator {
public static CreateAccountRequest convertEntityToRequest(final CreateAccountEntity createAccount){
return CreateAccountRequest.builder()
.field1(createAccount.getField1())
.field2(createAccount.getField2())
...
.build();
}
public static Account convertResponseToEntity(final Response<CreateAccountResponse> response){
return Account.builder()
.fieldX(response.getFieldX())
.fieldY(response.getFieldY())
...
.build();
}
}
AccountAdapterTranslator は @Bean または @Component ではなく、そうである必要もありません.静的メソッドを持つクラスだけで十分です.テスト目的でモックを作成する必要はありません.メソッドの実行を完了するだけです.
これらのいくつかは、開発者が自動的に行う傾向があるために発生します.熟考することは、機能を開発するときにできる最善を尽くすための優れた戦略です.
仕事をするためのより良い方法は常にあります. Spring 開発者になる前は Java 開発者であり、その前は開発者であり、問題を解決することが仕事であることを忘れないでください.
春の病気についてどう思いますか?春の病気は Java 開発者に他にどのような影響を与えると思いますか?
Reference
この問題について(Java 開発者にとっての春の病), 我々は、より多くの情報をここで見つけました https://dev.to/_fpineda/the-spring-illness-to-java-developers-1mn5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol