Java

JMockito を使う場合の注意

JUnit のモックは、org.mockito を使うことが多いのであろうか。 mockito-core と、mockito-inline を Maven pom.xml で依存関係を指定して使ったりする。 Mockito.when(~メソッド実行).thenReturn(リターン値); などを良く書いていたものだ。JMockito の書…

CompletableFuture を使って生成した複数スレッドを待ち合わせる。

Runnbale のタスクと Future のタスク、それぞれのサンプルコードを書いてみた。 以下、どちらもそうなのだが、 CompletableFuture の allOf メソッドが可変長引数で、リスト等のコレクションを指定できないので、 しかたなく、toArray(CompletableFuture[]:…

Java からシェルを実行

昔、Process を作成して動かすものを、yipuran-core に載せてあるが、近々、削除して 書き直そうと思っている。 以下のように、標準出力も標準エラー出力も区別なく結果として取得した方が 良いのではないかと。。。 public class ScriptExecutor{ private M…

例外捕捉で原因を掘り下げて処理をする場合

Throwable の getCause() で null にならないまで参照していく方法になり、 ネット検索すると腐るほどサンプルコードが出てくるだろう。。 while ループを良く見かけるが、個人的には、for文ループの方が良いと思っている。 }catch(Exception e){ for(Throwa…

AWS Batch をJavaプログラムから起動

AWS SDK for Java を使う <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-batch</artifactId> <version>1.12.295</version> </dependency> AWSBatchClientBuilder で AWSBatch クライアントを生成する。 SubmitJobRequest JOBリクエストとして、JOB送信名、JOBキュー、JOB定義名を指定して用意し AWSBatch クライアントで、…

Jackson @JsonProperty による必須チェック

Jackson による JSON → Java Objectで、JSON 側に対象フィールドキーが存在しない時 エラーにする方法、 @JsonProperty(required=true) を付ければ良いと思っていた。。。 import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; @Data…

Thread.sleep は精度低いから使わないのだけど、、

それでも、これしかないという時の為に、、、 public static Consumer<Integer> sleepSecApprox(long precision){ return t->{ LocalDateTime tc = LocalDateTime.now().plusSeconds(t); while(tc.compareTo(LocalDateTime.now()) > 0){ try{ Thread.sleep(precision)</integer>…

AWS Java SDK で Job起動の時に必要な Role

AWS Batch Jobを するとき、必要な権限、 aws.amazon.com でやろうとしていたのですが、 必要な Role 権限がなかなか解らなくて苦労しました。AWSBatchServiceEvenyTargetRoleだそうです。 { "Version": "2012-10-17", "Statement": [ { "Eggect": "Allow", …

Excel 指数表記と Apache POI

Excel で、8桁を超える数値を指数表記ではなく、そのまま8桁で格納、 これを Apache POI で読み込むと、 org.apache.poi.ss.usermodel.Cell は、 toString() では、指数表記になる。 10000000 → 1.0E7 つまり、double 型を toString() した場合と同じ。Apa…

Java でTupleが欲しい時、、、

https://blogs.oracle.com/otnjp/post/records-come-to-java-ja Java14 で導入された「レコード」の性質が名前付きタプルの側面を持っていることを考えると せめて Java11 にTuple が作れるようになっていて欲しかった。Lombok で、システム内で作るしかない…

Maven プロファイル指定ビルドと、生成物の名前

Maven profile を使用してビルド対象リソース管理しているプロジェクトで ビルドする JAR名も合わせて変更したい。という要求通常デフォルトのMaven がビルドするJAR は、artifactId 名 + "-" +バージョン番号 + ".jar" という書式で JARファイルが作成さ…

guice タイプセーフな annotatedWith

Google guice で JSR330 の @Named に対して、 バインド定義で @Namedアノテーションがついていることを限定する場合、 binder().bind(Logic.class).annotatedWith(Names.named("HIGH")).to(HighLogic.class); と、com.google.inject.name.Names の named(…

OGNL式、インナークラスの場合

先日、 oboe2uran.hatenablog.com を書きましたが、 滅多にないというかそんなクラス定義をして何の意味があるのだと思うが、、 インナークラスで定数を定義している場合、、 $でインナークラスを指定することになる。前回のサンプルを例にすると、、 packa…

bind定義を書かないでクラスに @Injectをした時の guice

通常 Google guice の使い方は、インターフェースに対する実装クラスのインスタンスが 割り当てられるように bind定義を書いてDIを実装する。うっかりというか、諸事情で見落として、 @Inject private Foo foo; と書いた Fooクラスが、インターフェースで…

継承時のlombok @Data

継承があるオブジェクトでは、@Data を使うと警告 Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=f…

Apache POI Excel Sheet の全行 ⇒ 読込みObjecのリスト

Apache POI を使用した Excel の操作はずいぶん昔からコードを書いていた。 PushbackInputStream を使用する - Oboe吹きプログラマの黙示録 Excel 拡張子 (xls) (xlsx) 両方に対応した操作 Apache POI (2) - Oboe吹きプログラマの黙示録 Excel 拡張子 (xl…

ThrowableFunction

Throwable 例外を投げて処理する関数型インターフェースを作っている。 yipuran-core/src/main/java/org/yipuran/function at master · yipuran/yipuran-core · GitHub使い道はいっぱいある。 Strin str = "[ \"A\", \"B\", \"C\" ]"; これを Jackson Object…

JUnit リスト比較

リストの完全一致の比較検証を簡単に記述できないかを考える。 比較対象のリストの要素がデータオブジェクトで、特定のフィールドは 比較対象にしたくない。というケースオブジェクトの比較対象にしたくないフィールドをコピーすることを以下を 使って簡単に…

Maven ビルドリソースの指定

以前、こんなものを書いたけど。。 Maven ビルド実行前にファイルコピー - Oboe吹きプログラマの黙示録改めてビルドでの指定は、こんな風に書く <build> <resources> <resource> <directory>${basedir}/src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> <include>**/*.json</include> </includes> </resource> </resources></build>

JUnit でログ出力を検証する。

JUnit で先日の System.setOut による標準出力先の切り替えを利用する方法である。 logger.info("AuthLogicImpl name = "+name); このロガーが標準出力する設定になっており、このログ出力をJUnit テストコードで検証する。 準備として便利な以下を使用でき…

JUnit で標準出力結果を検証

System.setOut で標準出力先を切り替えたのを元に戻す - Oboe吹きプログラマの黙示録より、切り替えによるJUnit で標準出力結果を検証するテストケースを以下のように書けば良い。 例) "OK"だけを標準出力するメソッドをテスト System.lineSeparator() を付…

System.setOut で標準出力先を切り替えたのを元に戻す

標準出力のバンドル FileDescriptor.out で戻せば良い。System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));例)ファイルに書いていて、元に戻す。 try(FileOutputStream fo = new FileOutputStream(new File("/work/test.txt"))){ …

リストの比較

JUnit リストの比較 Eclipse で、JUnit を書いていると、コード補完でうまく出てこなくて いつもイライラするので、メモ import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; MatcherAssert.assertThat(list1, CoreMatchers.is(list2)); …

Stream から 配列生成

Stream<T> の toArray(T::new);toArray の引数が IntFunction<A> なのであるからといって、 .toArray(v->new T[v]); と書く人は少ない。IntStream の toArray() が、int[] を生成するのだが、 int[] intary = IntStream.rangeClosed(1, 5).toArray(); Integer の配</a></t>…

JUnit static import

JUnit の時ぐらいしか使わない static import org.junit.Assert を使ってるのか、org.hamcrest.MatcherAssert を使ってるのか、 長いテストコードを素早く確認するのに、いちいち上までスクロールして確認なんて やってられない、 import static org.junit.A…

Java11 でテキストファイルを String に読込み

Java11 でテキストファイルを String に読込むのは、とても記述が楽だ。java.nio.file.Path に、java.nio.file.Files で対応できるのである。サンプル UTF-8 のファイル import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java…

【修正】オブジェクト間フィールドのコピー

先日の オブジェクト間フィールドのコピー - Oboe吹きプログラマの黙示録 を修正することにした。 それは、継承クラスにおいて継承元のフィールドをコピーすることを考慮すべきだからだ。 @Data @EqualsAndHashCode(callSuper=true) を書いているときのエン…

オブジェクト間フィールドのコピー

任意のオブジェクト間で、特定のフィールドだけをコピーするのに汎用的な方法を考えます。 これを考えるきっかけは、JUnit の assertEquals などを実行する前に、比較したくない属性フィールドは、 コピーして同じ値にしてしまおうという目的で、それを状況…

java.nio.file.Files の createDirectories

Files.createDirectory(Path path) は、path 生成元に存在しないディレクトリがあれば、 java.nio.file.FileAlreadyExistsException を発生するが、createDirectories なら、ディレクトリ作成できる権限、環境なら途中も生成 で作ってくれる。 try{ Path pat…

Java SHA256 の結果をどういう文字列にすべきか

Java SHA256 java.security.MessageDigest を使う場合結果として取得できる byte[] を、どういうHEX文字列にすべきか?String.format を使う手段もあるが、BigInteger の toString で16進を指定する手もある、 try{ byte[] hashbytes = MessageDigest.getI…