2013-05-29 8 views
13

Łączymy testy Spocka z Spring @ContextConfiguration, dzięki czemu możemy budować fasolę w kontekście wiosny, a następnie używać Spocka do rzeczywistych testów. Chcielibyśmy wstrzyknąć spockowe mocks do naszej fasoli szparagowej. Dla Mockito jest rozszerzenie, które pozwala ci na takie rzeczy, jak:Jak tworzyć makiety Spocka poza klasą specyfikacji?

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

, a następnie odsyłasz tę próbkę do innych fasoli szparagowych. Wydaje się, że nie ma takiego rozszerzenia dla Spocka. Z drugiej strony budowanie tego prawdopodobnie nie jest zbyt dużym wysiłkiem, jeśli wiesz, jak tworzyć Mocks poza klasą Specification. Jedynym sposobem na stworzenie spockowej sztuczki, o której mi wiadomo, jest:

T Mock(Class<T> type) 

w specyfikacji. Czy jest jakieś API w Spocku do tworzenia Mocków, gdy nie znajdujesz się w klasie Specification, więc mogłem stworzyć makiety Spocka dla kontekstu sprężynowego?

Odpowiedz

6

Tworzenie makiet poza klasą spec (i używanie ich w innej klasie spec) nie jest obecnie możliwe. Istnieje otwarte żądanie funkcji. Wdrożenie tego nie powinno być zbyt trudne, ale wymagałoby to pewnych zmian w spock-core. Przynajmniej musiałby istnieć sposób ręcznego dołączenia symulowanego obiektu do innej instancji spec. Prawdopodobnie byłoby też sens przenieść fałszywego API tworzenia użytkownika z klasy bazowej MockingApi.

Powinieneś być w stanie używać Mockito ze Spockiem, pod warunkiem, że zawiniesz cały kod weryfikacyjny zawarty w następnym bloku przez wywołanie metody pomocniczej, która zwróci true (ponieważ Spock uzna to za potwierdzenie). Coś jak then: mockito { /* mockito verifications go here */ }.

+4

Siedzę w sesjach SpringOne Spock i testMvc i zaczyna się wydawać oczywiste, że w celu wymieszania niektórych usług wyśmiewanych i niektórych usług skonfigurowanych przez Spring (na przykład w celu uniknięcia logiki integracji poza testem) ta funkcja byłaby bardzo przydatna. –

+0

Być może Specyfikacja Mixin jest tym, czego szukałem? –

+0

Nie jestem zaznajomiony z 'SpecificationMixin'. Występuje żądanie ściągnięcia w pracach, które pozwala na zewnętrzną konstrukcję makiet i mam nadzieję, że zostanie dostarczona z następną wersją Spocka. –

5

Znaleziono proste obejście, w którym można zastosować makiety Spocka w aplikacji Spring. Oto moja konfiguracja wiosna użycie makiety dla fasoli BASAR:

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

class DelegatingBasar implements Basar { 
    @Delegate Basar delegate 
} 

a tu prosty specyfikacji Spocka, który tworzy i używać mock:

@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

To jest zgrabne obejście :). W międzyczasie przeszliśmy do bardziej lekkiego podejścia. Staramy się trzymać z daleka od budowania kontekstów sprężynowych w naszych testach jednostkowych i samodzielnie wyśmiewać wszystkie zależności (zobacz https://gist.github.com/derkork/45d7fba64b54a41608e1). To znacznie zwiększyło naszą wydajność testową. Używamy sprężyny tylko do złożonych rzeczy, takich jak testy DAO, w których robimy prawdziwe instrukcje przeciwko bazie danych w pamięci. –

0

ta jest dość prosta z „czystą Wiosna ":

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

Oczywiście zakłada się, że prawidłowo rozkładasz konfigurację sprężyn. (Np Jeśli przedefiniować "myBean" w spring-config.xml następnie definicja w spring-config.xml zostaną wykorzystane, ponieważ ApplicationContext jest zasadniczo Mapa i najnowsza definicja umieścić w nim wygra.)

1

Stworzenie mocks poza specyfikacją klasy jest możliwe od Spocka 1.1 z DetachedMockFactory i SpockMockFactoryBean. Dostępna jest również przestrzeń nazw dla konfiguracji opartej na XML. Możesz znaleźć przykłady użycia in the documentation.

Test Wiosna za pomocą konfiguracji Java oparte i DetachedMockFactory wygląda następująco:

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

I oparty na XML konfiguracja może wyglądać następująco:

<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> 

Upewnij się, że to zależność spock-spring:

testCompile group: 'org.spockframework', name: 'spock-spring', version: '1.1-groovy-2.4-rc-3' 
Powiązane problemy