JUnitにおけるFormクラスを使用したcreateメソッドの記載方法に悩んでいます。
解決したいこと
現在JUnitの学習をしている初学者です。
初めての質問で内容に不備があるかもしれませんが、
ご容赦いただけると幸いです。
質問内容
JUnitを使用したテストに関する質問です。
CreateSeviceクラスにおけるcreateメソッドのテストコードを作成しております。
内容は、Formクラスのオブジェクトを使ってItemRepository.saveで保存する処理となっています。
テストを記載するにあたり、データ型(クラス型?)をどう切り替えればいいのか分かりません。
参考サイトでは以下のようなコードとなっていました。
(一部変更しています)
該当するソースコード
@Test
public void save() {
when(this.itemRepository.save(this.testItem)).thenReturn(this.testItem);
Item actual = this.itemService.save(this.testItem);
assertThat(actual).isEqualTo(this.testItem);
verify(this.itemRepository, times(1)).save(this.testItem);
}
上記の手本の場合、サービスクラスでItemオブジェクトを直接引数にして、
その引数に対してsaveメソッドを使用していると認識しております。
一方、自分のものでは上記のやり方ではうまくいきませんでした。
テスト対象のメソッド:ItemCreateServiceのcreateメソッド
@Transactional
public void create(ItemCreateForm createForm) {
Item item = new item;
Item.setName(createForm.getName());
itemRepository.save(item);
}
原因として、
テスト対象メソッドの引数がFormクラス
saveの対象となる引数がitem(エンティティ)
と異なっていることだと考えております。
どのようにこの問題を解決すればいいか、わからなくなっています。
先輩方のお力添えをいただければと思います。
よろしくお願いします。
自分の書いたコード
@Test
public void 商品を登録できる() throws Exception {
//given
Item testItem = new Item();
testItem.setName("商品")
Item testForm = new ItemCreateForm();
testForm.setName("商品")
//When
Mockito.when(this.itemRepository.save(testItem).thenReturn(testItem);
this.service.create(testForm);
Mockito.verify(this.itemRepository, Mockito.times(1)).save(testItem);
//saveの対象のItemオブジェクトと、比較しているtestItemは異なるためエラー
}
エラーコード
org.mockito.exceptions.misusing.PotentialStubbingProblem:
Strict stubbing argument mismatch. Please check:
- this invocation of 'save' method:
itemRepository.save(
com.practice.demo.entity.Item@346d61be
);
-> at com.practice.demo.service.CreateService.create(CreateService.java:42)
- has following stubbing(s) with different arguments:
1. itemRepository.save(
com.practice.demo.entity.Item@3e6ef8ad
);
-> at com.practice.demo.service.CreateServiceTest.商品を登録できる(CreateServiceTest.java:40)
Typically, stubbing argument mismatch indicates user mistake when writing tests.
Mockito fails early so that you can debug potential problem easily.
However, there are legit scenarios when this exception generates false negative signal:
- stubbing the same method multiple times using 'given().will()' or 'when().then()' API
Please use 'will().given()' or 'doReturn().when()' API for stubbing.
- stubbed method is intentionally invoked with different arguments by code under test
Please use default or 'silent' JUnit Rule (equivalent of Strictness.LENIENT).
For more information see javadoc for PotentialStubbingProblem class.
at com.practice.demo.service.CreateService.create(CreateService.java:42)
at com.practice.demo.service.CreateServiceTest.商品を登録できる(CreateServiceTest.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:79)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:85)
at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
プロセスは終了コード -1 で終了しました
0