2013-05-29 24 views
13

SpockテストとSpringの@ContextConfigurationを組み合わせることで、SpringコンテキストでBeanを構築し、Spockを実際のテストに使用することができます。我々は、私たちの春の豆にスポックモックを注入したいと思います。 Mockitoには次のような拡張機能があります:スペッククラスの外でSpockモックを作成する方法は?

<mockito:mock id="accountService" class="org.kubek2k.account.DefaultAccountService" /> 

そして、このモックを他の豆に参照してください。このようなSpockの拡張はないようです。あなたが仕様クラスの外でMockを作成する方法を知っているなら、これを再度構築することはおそらくそれほど多大な努力ではありません。私が知っているSpockモックを作成する唯一の方法は、

です。仕様クラスの中にいないときにMockを作成するためのSpockのAPIがあるので、SpringコンテキストのSpockモックを作成できますか?

答えて

6

スペッククラスの外にモックを作成する(および別のスペッククラスで使用する)ことは現在できません。このためのオープン機能リクエストがあります。これを実装するのは難しいことではありませんが、spock-coreにいくつかの変更が必要です。最低でも、模擬オブジェクトを別の仕様インスタンスに手動で接続する方法が必要です。おそらく、ユーザー指向モック作成APIをMockingApi基底クラスから移動することも意味があります。

thenブロックに含まれるすべての確認コードをtrue(Spockはそれをアサーションと見なすため)を返すヘルパーメソッドの呼び出しでラップする限り、MockitoをSpockで使用できるはずです。 then: mockito { /* mockito verifications go here */ }のようなものです。

+4

私はSpringOne Spock&testMvc sessに座っていますいくつかのサービスを混ぜ合わせるために、Springが設定したいくつかのサービス(例えば、テストの外に統合ロジックを持たないようにするため)が、この機能は非常に便利であることが明らかになり始めています。 –

+0

おそらくSpecificationMixinは私が探していたものですか? –

+0

私は 'SpecificationMixin'に慣れていません。作品にはモックの外部構築が可能なプルリクエストがあり、次回のSpockバージョンとともに出荷されることを願っています。 –

5

SpringアプリケーションでSpockモックオブジェクトを使用する簡単な回避策が見つかりました。ここに私の春の設定basar Beanのモックを使用する:

@Configuration @Profile("mocking") 
class MockingContext { 
    @Bean Basar basar(){ new DelegatingBasar() } 
} 

class DelegatingBasar implements Basar { 
    @Delegate Basar delegate 
} 

そしてここで作成し、モックを使う簡単なスポック仕様:

@Autowired 
Basar basar 
Basar basarMock 

def setup() { 
    basarMock = Mock(Basar) 
    basar.delegate = basarMock; 
} 

def "create a new seller"(User seller) { 
    given: 
     basarMock.findAllUsers() >> [] 
    when: 
     go "/static/sellers.html" 
     waitFor { $("#newUser") } 
     $("#newUser").click() 
     waitFor { $("#basarNumber") } 
     $("#basarNumber").value(seller.basarNumber) 
     $("#name").value(seller.name) 
     $("#lastname").value(seller.lastname) 
     $("#email").value(seller.email) 
     $("#saveUser").click() 
     waitFor { $("#successfullCreated") } 
    then: 
     1 * basarMock.saveUser({ newUser -> 
      newUser.basarNumber == seller.basarNumber 
      newUser.name  == seller.name 
      newUser.lastname == seller.lastname 
      newUser.email  == seller.email 
     }) 
    where: 
     seller << [ new User(basarNumber: "100", name: "Christian", lastname: "", email: ""), 
        new User(basarNumber: "ABC", name: "",   lastname: "", email: "")] 
} 
+1

これはすっきりした回避策です:)。その間、私たちはより軽量なアプローチに移行しました。私たちは単体テストで春の文脈を構築することから完全に離れ、すべての依存関係を自分たちで模倣しています(https://gist.github.com/derkork/45d7fba64b54a41608e1を参照)。これにより、テストスループットが大幅に向上しました。私たちは、DAOテストのような複雑なものに対しては、メモリ内のデータベースに対して実際のステートメントを撮影するためにのみスプリングを使用します。 –

0

は、これはかなり純粋な春」とストレートフォワードです":

def parentAppCtx = new StaticApplicationContext() 
parentAppCtx.beanFactory.registerSingleton("myBean", Mock(MyClass)) 
parentAppCtx.refresh() 
def appCtx = new ClassPathXmlApplicationContext("spring-config.xml", parentAppCtx) 

もちろん、Springの設定を適切に分解していることを前提としています。 (あなたがspring-config.xml"myBean"を再定義する場合ApplicationContextは基本的に地図あり、それに入れて最新の定義が勝つので、例えば、その後、spring-config.xmlでの定義は、使用されます。)仕様クラスの外モックの

1

作成が可能ですSpock 1.1以降はDetachedMockFactorySpockMockFactoryBeanです。 XMLベースの設定のためのspock名前空間もサポートされています。使用例in the documentationが見つかります。Javaベースの構成とDetachedMockFactoryを使用して

春のテストでは、次のようになります。

@ContextConfiguration(classes = [TestConfig, DiceConfig]) 
class DiceSpec extends Specification { 
    @Autowired 
    private RandomNumberGenerator randomNumberGenerator 

    @Subject 
    @Autowired 
    private Dice dice 

    def "uses the random number generator to generate results"() { 
     when: 
      dice.roll() 

     then: 
      1 * randomNumberGenerator.randomInt(6) 
    } 

    static class TestConfig { 
     private final mockFactory = new DetachedMockFactory() 

     @Bean 
     RandomNumberGenerator randomNumberGenerator() { 
      mockFactory.Mock(RandomNumberGenerator) 
     } 
    } 
} 

@Configuration 
class DiceConfig { 
    @Bean 
    Dice dice(RandomNumberGenerator randomNumberGenerator) { 
     new Dice(randomNumberGenerator) 
    } 
} 

そしてXMLベースの構成は次のようになります。

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:spock="http://www.spockframework.org/spring" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.spockframework.org/spring http://www.spockframework.org/spring/spock.xsd"> 
    <spock:mock id="randomNumberGenerator" class="RandomNumberGenerator"/> 
</beans> 

spock-spring依存関係を含めるようにしてください:

testCompile group: 'org.spockframework', name: 'spock-spring', version: '1.1-groovy-2.4-rc-3' 
関連する問題