0

私の問題に関連する投稿が見つかりませんでした。私は Mockito を使用しており、コントローラー内の動作をテストしたいと考えています。問題の核心は、モックされたインターフェイスに 2 つの引数を送信するときに Mockito を正しく使用していないことだと思います。引数を 1 つだけ送信すると問題なく動作します。Spring mock mvc も使用しているという事実は、これとは何の関係もないと思います。

私はインターフェースを持っていますMyService:

public MyObject doSomeDoggyStuff(long id, SomeOtherObject soo);

インターフェイスの目的は、処理を実行し、成功した場合に MyObject を返すことです。オブジェクトが見つからない場合は、null を返します。

私はコントローラを持っていますMyController:

@RestController
@RequestMapping(value = "/dogs")
public MyController
<snip>

 @RequestMapping(method = RequestMethod.POST, value = "/{id}/toys/{toy}")
  ResponseEntity<MyObject> doDoggyStuff(@PathVariable Long id, @RequestBody Toy toy) {
    MyObject result = this.myService.doSomeDoggyStuff(id, toy);
    if(result == null) {
       return new ResponseEntity("errorinfo", HttpStatus.NOT_FOUND);
     }
    else {
      return new ResponseEntity<MyObject>(result,HttpStatus.CREATED)'
     }
  }

私のテストクラスは次のようになります。

Public MyControllerTest <snip>

  @Mock
  private MyService myServiceMock;

  @InjectMocks
  private MyController myController;

テストメソッドの関連ロジックはこれに見えます。

MyObject myObj = new MyObject();
Toy toy = new Toy();

when(myServiceMock.doSomeDoggyStuff(1, toy)).thenReturn(myObj);
mockMvc
    .perform(
        post("/dogs/{id}/toys/{toys}", 1, toy).contentType(
            TestUtil.APPLICATION_JSON_UTF8).content(
            TestUtil.convertObjectToJsonBytes(toy))).andExpect(status().isCreated())
    .andReturn();

私が抱えている問題は、このシナリオで MyController をテストするときに次のことを期待していることです。MyObject result = this.myService.doSomeDoggyStuff(id, toy);

結果は、thenReturn で設定した myObj である必要がありますが、常に null に設定されています。私のサービスには、引数を 1 つだけ受け入れる他のメソッドがあり、正常に動作します。Mockito を使用して 2 つの引数を送信するときに、別の方法で何をする必要があるかを把握できません。

4

2 に答える 2

1

あなたの要件を正しく理解していれば、次のようにモックを使用する必要があります。

when(myServiceMock.doSomeDoggyStuff(eq(1), any(Toy.class))).thenReturn(myObj);

myObjコードを記述した方法では、インスタンス化したオブジェクトで呼び出された場合にのみモックが返されますToy。これは、Spring が独自にクラスをインスタンス化するためです。問題は引数の数とは関係ありません。

Toyただし、インスタンスだけでなく特定のインスタンスをテストする場合は、mockito がおもちゃと一致できるようequalsに、メソッドを追加する必要があります。hashCodeequals メソッドがない場合、参照がチェックされますが、インスタンスが同じではないため、それらは等しくありません。

于 2014-06-20T14:28:40.273 に答える
0

渡されたオブジェクトの詳細を確認するには、Toy に equals を実装するか、ArgumentCaptor を使用する必要があります。それ以外の場合 (geoand が既に言及したように)、参照を比較します。

于 2014-06-20T14:44:17.517 に答える