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 開発者に他にどのような影響を与えると思いますか?