きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Java

Gradleでマルチモジュールにしている状態から別モジュールのテストコードを共有する

テストのセットアップメソッドや、ファイルからドメインを生成するメソッド等々の便利メソッドを作るとします。マルチモジュールの場合、基本的にはプロダクトコードしか依存しないので、テストの便利メソッドは共有しません。 今回の記事では、テストコード…

【設計論】文字列だと単純にラップした型でも便利

ちょっとポエム寄りのお話です。 プリミティブ型をラップした型を作成することは、対象の業務を表現できることがメリットです。たとえば、主キーのIDが文字列だった場合に、次の制約があった場合でもプリミティブ型では伝えられません。 頭文字3桁がシステム…

メソッド呼出回数によって返却値を変更する(正常と例外)【JavaのMockito】

Mockitoを使用して、モックにしたメソッドの呼出回数によって正常な値と例外を返却する方法を残します。 環境 Java 17 org.mockito.junit.jupiter 4.0.0 ユースケース 1 対応 次の現在日付を返却するメソッドをモックにします。 public interface OffsetDate…

Javaでメソッド参照を使ったまま、ラムダ式で条件否定をする(Predicate.not)

私はラムダ式での可読性を上げるため、メソッド参照を使用することが多いです。ただ、メソッド参照を使用したまま条件否定する方法を知らなかったため、無名関数を使用して条件を否定していました。または、内部で条件否定をしたメソッドを別に用意している…

Javaで日付の差が何ヵ月かを計算する。あまりは切り上げる (LocalDate, ChronoUnit)

閏年等を考慮しだしたら混乱したのでメモ残します。 環境 Java 17 対応 対応自体は簡単で、ChronoUnit.MONTHESで月の差分を取得できます。今回は、1ヵ月に満たない日付がある場合は切り上げるので+1するだけです。 LocalDate start; LocalDate end; ChronoUn…

Lombokで自動生成されるGetterのprefixを変更したかった(Accessor prefixが使いたかった)

うまくいかなかったことのメモ。 環境 IntelliJ IDEA 2021.3.3 (Ultimate Edition) 2022/05/07時点 きっかけになったツイート なるほど。APIでyyyymmddのフォーマットを期待するrequest date型を用意してたけど、そこからlocaldateに変換するときにメソッド…

Javaでnull様等のnullという文字列を埋める(String#formatted)

以前にMessage.formatを使用して、null様のnullという文字列を埋める方法を調べました。 Java15にて新しくStringにformattedメソッドが増え、null様のnullという文字列を埋める方法が新しくできるようになりました。内部的に使用しているFormatterクラス自体…

Java 8以降、Javaで文字列の日付存在チェックする(閏年でないときの閏日チェック)(Check leap day)

JSON等でデータのやりとりをする時には、直接日付型を渡すことができません。文字列で渡す必要があります。 ただし、日付に関しては閏年が存在するため、単純な正規表現では文字列の異常値を検出できません。 今回の記事では、Javaで文字列の日付が存在する…

JavaのLombokのWithアノテーションを素振りした

個人用ネタ。 今回素振りするのはLombokのWithアノテーションです。他の言語でも同様の機能を達成したいときにwithという名前を使ってみてはいかがでしょうか。おそらく、Javaに限らず他言語でも通用するメソッドです。 環境 Java 17 ゴール LombokのWithア…

JavaにてJSONからインスタンスを生成する(テスト時に重宝)

個人的にはテストで多用していることが多いです。JacksonライブラリのObjectMapper最高ですね。 具体的にどのようなユースケースで使用しているかという点に関しては、一番最後に記載しています。 なお、Jacksonライブラリを使用したObjectMapperの記事は大…

Springで同一クラス別コンポーネントをDIしたい(nameGeneratorとFullyQualifiedAnnotationBeanNameGenerator)

Springで開発していると、別のコンポーネントだが、同一のクラス名を作りたくなることがあります。この同名クラスをDIしない場合は、特に問題は発生しません。しかし、同一クラス名をDIしてしまうと、BeanDifinitionStoreExceptionが発生してしまいます。 こ…

JavaをSonarCloudでカバレッジ取りながら静的分析する(Gradle, 2021年)

2021年になってGitHub Actions等のCIを使ったSonarCloud連携がしやすくなったので、手順を纏めます。 今回の記事では、JaCoCoでカバレッジを取得して、コードをSonarCloudへ連携できることをゴールとします。 環境 Java 11 JaCoCo SonarQube 3.3 Gradle 7.0.…

Javaで配列の特定の条件を満たすデータのみを操作したかった

※ 泥臭いやり方でしか実践できていません。 JavaのLINEオープンチャットにて、「配列内部の特定条件のみ変換したい」という質問がありました。 今後、同様の質問が来たときにスマートな回答ができるようにいくつか検証したメモを残します。なお冒頭にも書い…

SpringBootで実際のDBにつなげてユニットテストする

SpringBootで実際に起動してあるDBを使ったユニットテストをしようとすると、デフォルトだと動かないようです。 正確にはEmbeddedDataSourceBeanFactoryPostProcessor(ログだと長すぎるのでbeddedDataSourceBeanFactoryPostProcessorとして表示される)やEm…

SpringのTestExecutionListenerのTestContextから設定ファイルの値を読み込む

小ネタ。 環境 Java 16 SpringBoot 2.4.5 概要 設定ファイルの値を取得したい場合は、TestContextからApplicationContext、Environmentを経由してgetProperty(String key)で取得できます。 testContext .getApplicationContext() .getEnvironment() .getProp…

SpringでAPIからファイルをダウンロードする(Java)

この記事では、JavaのSpringBootを使って、APIからファイルをダウンロードする機能の実装メモを残します。なお、ResponseBodyがないため、@Controllerでも、@RestControllerのどちらで定義しても構いません。 なお、クラウドを使用している場合はAWSであれば…

SpringのAssertクラスで簡単にValidationする【Java】

この記事はAssertクラスを紹介するだけの小ネタです。 Springには、Assertクラスという簡単にValidationしてくれるようなクラスがあります。複雑なことはできませんが、サクっとメソッドのパラメータを検証したい時は便利です。なお、複雑なことをしたければ…

Wiremockをモックサーバとして使用してJavaの単体テストをする

弊社ではモックサーバにWiremockを使用しています。 この記事ではWiremockを知ってもらうきっかけを提供することを目的としています。詳しいことは他の方の記事を参考にした方が良いでしょう。 ゴール WiremockのモックサーバでJUnitでテストする Wiremockの…

Javaでカンマ区切りの文字列を作る(StringJoiner, StringBuilder, String)

小ネタ。JavaのStringJoinerを使うことで、カンマ区切りの文字列を簡単に作れます。 今回の記事は、StringBuilderを使ったカンマ区切りの文字列の作り方をメモします。既存のStringBuilderでのカンマ区切りの文字列を作り方も併記します。 環境 Java 15 クラ…

Javaで事前条件を満たしていないテストを安全に終了させる(AssumeTrue)

たとえばDBは本番環境ではOracle、テスト環境ではH2を使っているケースがあるとします。その場合、Oracleでは動くがH2では動かないSQLを作成してしまうことが考えられます。 他にも、本番環境はAmazon RDS for Oracleを使っているが、テスト環境で用意できて…

Javaで標準入力と標準出力を使ったコードをテストする

標準入力と標準出力をテストしようとすることは基本的にはありません。標準出力ではなく、Loggerに書き込まれていることを確認することが多いでしょう。 しかし、知っておいて損はありません。今回の記事では、FizzBuzzを使って標準入力と標準出力のテストを…

Mavenのproxy設定は1つしか有効に設定できない

タイトルの出オチ記事。これを知るためだけに4日くらい無駄にしました。参考先のブログに感謝です。 環境 Maven 3.6.0 結論 Mavenでproxyを通す設定は、~/.m2/settings.xmlに設定する必要があります。 ただし、~/.m2/settings.xmlに複数定義できても、設定は…

DBからJavaのResultSetにLocalDateTimeやBigInteger等の基本型以外の型を直接設定する

TwitterやJavaのオープンチャットででたまーにResultSetから直接LocalDateTimeやBigIntegerを取得できずに、一旦Stringやjava.sql.Dateで取得した後に変換している、ということを見かけることがありました。直接LocalDateTimeやBigIntegerで取得することがで…

Javaで比較するときはObjects.equalsを使うのがオススメ

小ネタ。正直、記述量が増えるので好き嫌いで言うと嫌いですが、NullPointerException(以後、NPE)が発生しなくなるので安全に処理したい時はオススメです。 環境 Java 15 出現時期 java.util.Objects Java1.7 Java7の時代からあります。分かりづらいですが、…

LombokでToString.IncludeとExclude、callSuperで便利にログ出力する

小ネタ。JavaにはLombokという便利なライブラリがあります。その便利なライブラリの中にあるToString、その中でもIncludeとExclude, callSuperを駆使すると便利だったので、ぜひ覚えてください。 この記事では、ToStringのInclude, Exclude, callSuperの3つ…

Javaで起動後DBの値をキャッシュに持つ等をPostConstructで処理させる(SpringBoot)

Javaのオープンチャットにて、「SpringBootの起動時にDBアクセスしてマスタデータを保持することは可能ですか?」といった質問が出てきました。 この記事は、解決方法として挙げられたPostConstructという処理を理解していなかったので、PostConstructを勉強…

Javaで最近使っているParameterizedTest【2021年版】

※ JUnit5のアップデートを知るための記事ではありません。私の知識アップデートをお伝えする記事になっています。 以前、ParameterizedTestに関する記事を書きました。その時は、テストコードの表現力を意識して、ArgumentsSourceを使ったほうが良いという結…

SpringのSpELでネストしたクラスの値をリフレクションして取得する

Java単体でもリフレクションで値を取得できます。しかし、ネストされた値を取得することは非常に面倒です。 Springではもっと簡単に値を取得することができます。それは、Spring式言語(Spring Expression Language、以後 SpELと表現します)を使用した方法で…

Javaでリフレクションを素振りする

基本的にはIDEのサポートが得られなかったり、静的解析してくれないので、リフレクションは使ってはいけません。しかし、非推奨であることと、使えないことは違います。 当記事では、Javaでリフレクションを使ってprivateメソッドとフィールドを呼び出せるこ…

JavaでLocalDateとLocalDateTimeを元に月末日を求める

年と月のパラメータから月末日を求めるYearMonth型の記事を書きました。しかし、個人的に時刻を扱うときはLocalDate, LocalDateTimeのどちらかで扱いたいです。 今回の記事では、LocalDate, LocalDateTimeを元に月末日を求めます。 環境 Java 15 前提条件 な…