2013-05-29 13 views
13

Spock testlerini Spring'in @ContextConfiguration ile birleştiririz, böylece bir bahar bağlamında fasülyeler kurabilir ve ardından gerçek test için Spock'i ​​kullanabiliriz. Bahar fasulyemize spock alaylarını enjekte etmek istiyoruz.Spesifikasyon sınıfının dışında Spock alayları nasıl oluşturulur?

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

ve daha sonra diğer yay fasulye için bu alay başvuru: Mockito için aşağıdakilere benzer işlemler sağlayan bir uzantı bulunmaktadır. Spock için böyle bir uzantı yok gibi görünüyor. Ardından tekrar oluşturma, Şartname sınıfının dışında Mocks yaratmayı biliyorsanız, çok fazla çaba göstermeyecektir. Bildiğim bir Spock taklidi yaratmanın tek yolu: Şartnamede

T Mock(Class<T> type) 

. Spesifikasyon sınıfının içinde bulunmadığında Mocks oluşturmak için Spock'te bazı API var mı? Bu yüzden bir bahar içeriği için Spock alayları oluşturabilir miyim?

cevap

6

Belirli bir sınıfın dışındaki (ve bunları başka bir özellik sınıfında kullanarak) alay oluşturma şu anda mümkün değil. Bunun için açık bir özellik isteği var. Bunu uygulamak çok zor olmamalı, ancak spock çekirdeğinde bazı değişiklikler gerektiriyordu. En azından, sahte bir nesneyi başka bir örnekleme örneğine el ile eklemenin bir yolu olması gerekir. Muhtemelen, kullanıcılara yönelik sahte oluşturma API'sini MockingApi taban sınıfından çıkarmak da mantıklı olacaktır.

true'u döndüren bir yardımcı yöntemle bir arama bloğunda bulunan tüm doğrulama kodunu sardığınız sürece, Spoki ile Mockito'yu kullanabilmeniz gerekir (çünkü Spock bunu bir onaylama olarak görür). then: mockito { /* mockito verifications go here */ } gibi bir şey.

+4

SpringOne Spock & testMvc oturumunda oturuyorum iyon ve apaçık bazı hizmetlerin karıştırılması için ve Spring tarafından yapılandırılan bazı servislerin (örneğin test dışında entegrasyon mantığından kaçınmak için) bu özelliğin çok yararlı olacağının açık olduğunu hissetmeye başlar. –

+0

Belki de SpecificationMixin aradığım şey nedir? –

+0

"SpecificationMixin" ile aşina değilim. Aldatmacanın dışarıdan yapılmasına izin veren çalışmalarda bir çekme talebi var ve umarım bir sonraki Spock versiyonuyla birlikte gönderilir. –

5

Bir yay uygulamasında Spock alay nesneleri kullanmak için basit bir geçici çözüm bulundu. İşte benim bahar yapılandırma basar fasulye için bir taklidini kullanmak:

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

class DelegatingBasar implements Basar { 
    @Delegate Basar delegate 
} 

Ve burada oluşturur basit bir Spock şartname ve sahte kullanın:

Bu güzel ile düz ileri olduğunu
@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

Bu temiz bir çözümdür :). Bu arada, daha hafif bir yaklaşıma geçtik. Ünite testlerimizdeki yaylı bağlamlardan tamamen uzak durmaya ve tüm bağımlılıkları kendimiz çözmeye çalışıyoruz (bkz. Https://gist.github.com/derkork/45d7fba64b54a41608e1). Bu test verimimizi önemli ölçüde artırdı. Biz sadece, bellek içi veritabanına karşı gerçek ifadeler çekeceğimiz DAO testleri gibi karmaşık şeyler için kullanıyoruz. –

0

"saf Bahar ":

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

Elbette, Bahar yapılandırmanızı doğru şekilde ayrıştırdığınızı varsayar. (Eğer ApplicationContext esasen olduğundan spring-config.xml tanım, kullanılacak "myBean" sonra spring-config.xml içinde yeniden tanımlamak durumunda örneğin, içine koymak bir Harita ve en son tanım kazanacak.) Bir özellik dışı mocks ait

1

Oluşturma sınıf mümkündür 0'dan beri Spock 1.1 ile DetachedMockFactory ve. XML tabanlı yapılandırma için spock ad alanı da desteklenmektedir. Kullanım örneklerini in the documentation bulabilirsiniz.

Java tabanlı yapılandırma ve DetachedMockFactory kullanan bir Yay test şuna benzer:

<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 bağımlılık eklemeyi unutmayın:

@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) 
    } 
} 

Ve XML tabanlı konfigürasyon şu şekilde görünecektir:

testCompile group: 'org.spockframework', name: 'spock-spring', version: '1.1-groovy-2.4-rc-3' 
İlgili konular