8

アプリケーションでSpringを使用していて、すべてのクラスの単体テストを作成したいと思います。アプリケーションからいくつかの外部Webサービスを呼び出しますが、機能をテストしたいだけなので、Mockitoを使用してそれらをモックしたいと思います。

次のシナリオがあるとしましょう

これは私のWebサービスインターフェイスです

public interface MyWebService {
    public String getSomeData(int id);
}

私は上記のサービスをこのように使用します

public interface MyService {
    int doSomethingElse(String str);
}

public class MyServiceImpl implements MyService {

    private MyWebService myWebService;

    int doSomethingElse(String str) {
        .....
        myWebService.getSomeData(id);
        ...
    }
}

public interface MyService1 {
    Stirng methodToBeTested();
}


public class Class1 implements MyService1{
    @Resource
    private MyService myService;

    public Stirng methodToBeTested() {
        myService.doSomethingElse("..");
    }
}

私はuintテストケースを以下のように書きました。単体テストを実行するために、ここでMyServiceをスパイしています。

public class class1Test {

    @Spy
    MyService myService;

    @Resource
    @InjectMocks
    Class1 class1;

    public void setUPTest() {
        MockitoAnnotations.initMocks(this);
    Mockito.doReturn(123).when(myService).doSomethingElse("someString");
    }

    @Test
    public void methodToBeTestedTest() {
        this.setUPTest();
            ...
            class1.methodToBeTested();
    }

}

テストを実行すると、スタブ中に言及した内容をWebサービスから取得することがわかります。

誰かがこれを手伝ってくれますか?

4

6 に答える 6

6

私はspringjavaconfigを使用してこれを解決しました。テスト構成ファイルでデフォルトの構成ファイルを拡張しました。

    @Configuration
    public class TestConfig extends DefaultConfig {

      @Bean
      public MyService myService() {
        return Mockito.spy(new MyServiceImpl());
      }
    }

今、私のテストクラスはこのようになります

public class class1Test {

    @Resource
    MyService myService;

    @Resource
    Class1 class1;

    public void setUPTest() {
        MockitoAnnotations.initMocks(this);
    Mockito.doReturn(123).when(myService).doSomethingElse("someString");
    }

    @Test
    public void methodToBeTestedTest() {
        this.setUPTest();
            ...
            class1.methodToBeTested();
    }

}
于 2013-03-29T07:55:38.027 に答える
3

A@Spyは、サービスを呼び出すときに何が起こるかをスパイするために使用されます(たとえば、推移的なメソッド呼び出しの有無を表明するのに役立ちます)。必要なのは@Mockアノテーションです。

public class class1Test {
    @Mock MyService myService;
    ...

これにより、すべてのmyServiceメソッドがnullを返し、doReturn/でオーバーライドしたメソッドを除外しますwhen

ちなみに、テストメソッドから呼び出すのではなく、でsetUpTest()注釈を付ける必要があります@Before

乾杯、

于 2013-03-26T11:03:34.250 に答える
3

一部のテストでBeanをモックに置き換えるには、Springockitoまたはより優れたSpringockitoアノテーションを使用します。

このようなものが機能するはずです:

@ContextConfiguration(loader = SpringockitoContextLoader.class,
    locations = "classpath:/context.xml")
public class SpringockitoAnnotationsMocksIntegrationTest extends AbstractJUnit4SpringContextTests {

    @WrapWithSpy
    private MyService innerBean;

    @Resource  
    Class1 class1;

    public void setUPTest() {        
        Mockito.doReturn(123).when(myService).doSomethingElse("someString");
    }

    @Test
    public void methodToBeTestedTest() {
    this.setUPTest();
        ...
        class1.methodToBeTested();
    }

}

于 2013-03-26T11:46:28.693 に答える
2

メソッドで「someString」ではなくanyString()を意味しますsetUpか?これはeq("someString")、特定の文字列を使用してメソッドを呼び出す場合にも発生する可能性があります。

Mockitoの理解から、スパイはクラス設計の問題を示している可能性があるため、スパイは使用しません。@Mock全体を使ってMyServiceみませんか?

@Mock MyService myService;


public void setUpTest() {
    MockitoAnnotations.initMocks(this);
    when(myService.doSomethingElse(anyString)).thenReturn(123);
}
于 2013-03-26T11:10:29.457 に答える
2

変更、

    public class class1Test {

    @Mock
    private MyService myService;

    private Class1 class1;

    @Before
    public void onceBeforeEachTest() {
        MockitoAnnotations.initMocks(this);
         this.class1 = new Class1(myService); 
        Mockito.when(myService).doSomethingElse(anyString()).thenReturn(123);
    }

    @Test
    public void methodToBeTestedTest() {
            class1.methodToBeTested();
    }
}
于 2013-03-26T11:13:23.817 に答える
1

これはあなたのニーズに合うはずです:

@RunWith(MockitoJunitRunner.class)
public class class1Test {

    @Mock
    private MyService myService;

    private Class1 class1;

    @Before
    public void setUp() {
        this.class1 = new Class1(myService); // creates this constructor.
    }

    @Test
    public void methodToBeTestedTest() {
        this.class1.methodToBeTested();
        Mockito.verify(this.myService).doSomethingElse(/* put expected arg here */);
    }
}

公式ドキュメントも参照してください。

于 2013-03-26T11:09:14.190 に答える