• 2019年6月3日月曜日
アリスト戦記
アリスト戦記 https://blog.aristo-solutions.net/2019/06/junit5assertequalsassertsame.html

JUnit5のassertEqualsとassertSameの違い

JUnit5には「assertSame」というアサーションがある。

メソッド名を見ると「assertEqualsと同じではないのか?」という気もするのだが、調べてみたところ、assertSameはオブジェクト自体が同じかどうかをチェックするもののようだ。

例を見てみよう。
まずはassertEqualsから。

assertEqualsの場合

普通はこんな書き方をしないが、assertEqualsで文字列を照合するとこうなる。

@Test
public void myTest1() {

   String expected = new String("にゃん");

   String actual = "にゃん";

   assertEquals(expected, actual);
}

わざわざnew String()とやっているが、これでインスタンスをnewして作っているわけだ。

インスタンスをnewしようがしまいが、中に入っている文字列は同じ。
そしてassertEqualsは中に入っている文字列を照合する機能である。

assertSameの場合

では、assertSameの場合はどうか?

@Test
public void myTest2() {

   String expected = new String("にゃん");

   String actual = "にゃん";

   assertSame(expected, actual);
}

これだとエラーになってしまう。

assertSameはインスタンスとして同一オブジェクトであるかどうかをチェックするもので、このソースだと「expected」と「actual」は中身に入っている文字は同じかもしれないけど、インスタンスとしては別々にJVM空間に生成されているでしょ?

だからassertSameではエラーになる。
assertSameとはそういうことだ。

用途

インスタンスとして同一であるかどうかまで照合するなんてそうそう無いと思うんだが。
思い当たる用途としては、シングルトンだな。

シングルトンってのは同一インスタンスをグローバル変数的に使い回すことで処理効率を上げる機能だ。
そのシングルトンが正常作動しているかどうかは、assertSameでチェック可能だろう。

余り使わない機能かもしれないが、予備知識として知っておいても良いかもしれないな。

0 件のコメント:

コメントを投稿