2016-08-10 13 views
0

私がテストしたいクラスがあります。 package com.something;Spockメソッド内でオートワイヤードクラスの関数呼び出しを模擬する方法

import org.springframework.beans.factory.annotation.Autowired; 
public class ClassToTest implements InterfaceToTest{ 

    @Autowired 
    AnotherService serviceA; 

    @Override 
    public List<String> methodToTest(List<String> randomVar){ 
    ... 
    String stringA = serviceA.someFunction(randomVar); 
    ... 
    } 
} 
スポックをテストするとき、私は私の選択の任意の文字列を返すようにserviceA.someFunction(randomVar)への呼び出しの結果を模擬することができますどのように

package com.something; 
import spock.lang.Shared 
import spock.lang.Specification 
class TestClass extends Specification{ 
    @Shared InterfaceToTest classToTest = new ClassToTest() 

    static doWithSpring = { 
    serviceA(AnotherService) 
    } 

    def "tests-part-1"(){ 
    when: "something" 
    ... 
    then: "expect this" 
    ... 
    } 
} 

ここからどこに行くのかわかりません。私のIDEは、テストクラスに追加したdoWithSpringコードのエラーを表示します。これに対処する方法のアイデア?

答えて

1

私は単体テストの観点から考えてみることをお勧めします。あなたは、春のフレームワークのものを模倣し、あなたのロジックをテストしていることを確認したい。これはSpockと非常に簡単です。

ClassToTest myClass = new ClassToTest(serviceA: Mock(AnotherService)) 

def "test my method"() { 
    when: 
    myClass.methodToTest([]) 

    then: 
    1 * myClass.serviceA.someFunction([]) >> 'A string' 
} 

ここから、ドライブしているデータや、>>>を使用して戻ってみたい文字列のリストを渡すことができます。

+0

これをやってみましたが、groovyはgroovy.land.MissingPropertyExceptionを返します。 "そのようなプロパティはありません:クラスcom.something.ClassToTestのserviceA –

1

ユニットテストの場合は、@rockymplsの示唆をしてください。

統合/コンポーネントテストの場合は、spock-springの依存関係を含めて、Spockのメンバーからtest examplesを見てください。 thisを参照してください春のブートテストのものの詳細については

@SpringBootTest(classes = Application) 
@ContextConfiguration 
class SomeIntegrationTest extends Specification { 

    @Autowired 
    SomeService someService 

    def 'some test case'() { 
     ... 
    } 
} 

:あなたは1.4+春ブーツを使用している場合はさらに、あなたのような何かを行うことができます。ユニットテストを有効にする

1

簡単な解決策は、このようなサービスAフィールドを設定し、コンストラクタを持っているClassToTestを変更することです:

import org.springframework.beans.factory.annotation.Autowired; 
public class ClassToTest implements InterfaceToTest{ 

private AnotherService serviceA; 

@Autowired 
public ClassToTest(final AnotherService serviceA){ 
    this.serviceA = serviceA; 
} 

@Override 
public List<String> methodToTest(List<String> randomVar){ 
... 
String stringA = serviceA.someFunction(randomVar); 
... 
} 
} 

その後、あなたのスポックのユニットテストであなたは、コンストラクタでモックを提供することができます。

class TestClass extends Specification{ 
def mockServiceA = Mock(AnotherService) 
@Shared InterfaceToTest classToTest = new ClassToTest(mockServiceA) 

そして、あなたはいつものスポックの方法でモックができ、各テストケースで:

1 * mockServiceA.someFunction(_) >> 'A string' 
関連する問題