14

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

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

次に、このモックを他のSpring Beanに参照します。Spock にはそのような拡張機能はないようです。仕様クラスの外部でモックを作成する方法を知っていれば、これを構築するのはおそらくそれほど労力ではありません。私が知っている Spock モックを作成する唯一の方法は次のとおりです。

T Mock(Class<T> type)   

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

4

4 に答える 4

5

Spring アプリケーションで Spock モック オブジェクトを使用する簡単な回避策を見つけました。ここで、basar Bean のモックを使用するための私の春の構成:

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

class DelegatingBasar implements Basar {
  @Delegate Basar delegate
}

そして、モックを作成して使用する単純な Spock 仕様を次に示します。

@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: "")]
}
于 2015-03-22T10:09:17.077 に答える
0

これは、「純粋なSpring」を使用すると非常に簡単です。

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

もちろん、Spring 構成を適切に分解していることを前提としています。(たとえば、 で再定義"myBean"するとspring-config.xml、 での定義spring-config.xmlが使用されます。これは、ApplicationContextは基本的に Map であり、それに配置された最新の定義が優先されるためです。)

于 2015-09-15T22:22:44.783 に答える