2

私は Spock と Mockito を使用していますが、Mocks から価値を得る方法を理解するのに苦労しています。

UserResourceEJB3 サービス層と通信する REST インターフェース用の RESTful サービスを構築しようとしています。

EJB3 サービスには、別の開発者が作成する予定の新しいメソッドが必要です。したがって、REST インターフェイスの代わりに Mock を作成することにしました。

Here is my Spock Test:

package commonapi.test

import commonapi.command.request.UserCreateRequest
import commonapi.command.resource.UserResource
import commonapi.response.CommandResponse
import org.mockito.Mock
import org.mockito.MockitoAnnotations

import spock.lang.Specification

import static org.mockito.BDDMockito.given
import static org.mockito.Mockito.*

/**
 * Specification for Create User Command.
 */
class CreateUserTest extends Specification
{

    /**
     * Mocked Resource.
     */
    @Mock
    UserResource mockedUserResource;

    def setup()
    {
        MockitoAnnotations.initMocks(this)
    }

    def "Mocked Resource Create Single User"()
    {
        given:
            UserCreateRequest createRequest = new UserCreateRequest()
            given(mockedUserResource.createUser(createRequest)).willReturn(new CommandResponse())
        when:
            CommandResponse commandResponse = mockedUserResource.createUser(createRequest)
        then:
            commandResponse != null
    }
}

コンパイルされ、テストが実行されます(合格)

問題は、実際には何も「テスト」していないように感じることです。私が理解できる限り、Mockito Mocks は単に「空のオブジェクト」であり、「動作を設定」できます。つまり、x を指定すると、y が返されます。

ただし、動作を設定している場合は、本質的に、その特定の Spock Feature Method の目的でどのように動作するかをコーディングしています。これは、実装された後の実際のものと同じである場合と異なる場合があります。

基本的に、私はテストの目的でモックの動作を構築しており、実際のものをテストしていません。

モックを活用して開発中のシステムを適切にテストする方法について、概念的に少し苦労していると思います。

どんな提案や洞察も大歓迎です。前もって感謝します!

4

1 に答える 1

6

あなたの説明の最初の部分に基づいて、私はあなたが間違ったことを嘲笑していると思います。私があなたの問題をどのように理解しているかを確認できるように、あなたの言ったことを再解釈させてください。

  1. REST API を作成しています。
  2. 他の誰かがそのためのビジネス ロジックを EJB で書いています。
  3. あなたが書いているものをテストするためにいくつかのテストを書きたい

その場合、REST コードではなく、EJB コードをモック化する必要があります。純粋な Java/Mockito の例を次に示します。

package com.sandbox;

import org.junit.Test;
import static org.mockito.Mockito.*;

public class SandboxTest {

    @Test
    public void myTest() {
        Ejb mock = mock(Ejb.class);
        RestApi restApi = new RestApi();
        restApi.setEjb(mock);

        restApi.doLogic();

        verify(mock).logic();
    }

    private static class Ejb {

        public void logic() {

        }
    }

    private static class RestApi {
        private Ejb ejb;

        private void setEjb(Ejb ejb) {
            this.ejb = ejb;
        }

        public void doLogic() {
            ejb.logic();
        }
    }            
}

ここで、テスト対象のシステムはRestApi.doLogicです。そして、あなたのテストはこれにいくらか似ているはずです。テストでモックを直接呼び出さないことに注意してください。System Under Test ( ) を呼び出すことで間接的に呼び出しますRestApi.doLogic()

これはあなたの例とは異なります。実際にテストしているのは、モックを正しく設定することだけです。要約すると、テスト対象のシステムではなく、テスト対象のシステム の依存関係をモックアウトする必要があります。

于 2013-05-20T20:46:56.480 に答える