Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

JUnitにおけるFormクラスを使用したcreateメソッドの記載方法に悩んでいます。

Discussion

Closed

解決したいこと

現在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

Your answer might help someone💌