2015-05-28 2 views
1

Я новичок в jmockit и хотел бы издеваться над компонентом моей конфигурации Spring Spring на основе Java. Я думал (лучше надеялся) она будет идти, как это:Как создать издеваемую (jmockit) весеннюю фасоль?

@Configuration 
public class MyApplicationConfig { 

    @Bean // this bean should be a mock 
    SomeService getSomeService() { 
    return new MockUp<SomeService>() {@Mock String someMethod() { return ""; }}.getMockInstance(); 
    } 

    @Bean // some other bean that depends on the mocked service bean 
    MyApplication getMyApplication(SomeService someService) { 
    .... 
    } 
} 

Но к сожалению это терпит неудачу с «Invalid места, чтобы применить макет».

Интересно, могу ли я генерировать jmockit mocks внутри классов конфигурации Spring. Мне нужен bean-компонент, потому что на него ссылаются другие bean-компоненты, и вся инициализация Spring Context терпит неудачу, если я не предоставляю mock в качестве Spring-компонента.

Спасибо за любую помощь.

ответ

2

Просто используйте свою обычную конфигурацию пружины. В тестовом классе объявите тип, который будет издеваться над @Capturing. Он будет издеваться над тем, какой класс реализации использовал Spring.

Редактировать: добавлен полный пример кода ниже.

import javax.inject.*; 

public final class MyApplication { 
    private final String name; 
    @Inject private SomeService someService; 

    public MyApplication(String name) { this.name = name; } 

    public String doSomething() { 
     String something = someService.doSomething(); 
     return name + ' ' + something; 
    } 
} 

public final class SomeService { 
    public String getName() { return null; } 
    public String doSomething() { throw new RuntimeException(); } 
} 

import org.springframework.context.annotation.*; 

@Configuration 
public class MyRealApplicationConfig { 
    @Bean 
    SomeService getSomeService() { return new SomeService(); } 

    @Bean 
    MyApplication getMyApplication(SomeService someService) { 
     String someName = someService.getName(); 
     return new MyApplication(someName); 
    } 
} 

import javax.inject.*; 
import org.junit.*; 
import org.junit.runner.*; 
import static org.junit.Assert.*; 
import mockit.*; 
import org.springframework.test.context.*; 
import org.springframework.test.context.junit4.*; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = MyRealApplicationConfig.class) 
public final class MyApplicationSpringTest { 
    @Inject MyApplication myApplication; 
    @Mocked SomeService mockService; 

    @BeforeClass // runs before Spring configuration 
    public static void setUpMocksForSpringConfiguration() { 
     new MockUp<SomeService>() { 
      @Mock String getName() { return "one"; } 
     }; 
    } 

    @Test 
    public void doSomethingUsingMockedService() { 
     new Expectations() {{ mockService.doSomething(); result = "two"; }}; 

     String result = myApplication.doSomething(); 

     assertEquals("one two", result); 
    } 
} 

import org.junit.*; 
import static org.junit.Assert.*; 
import mockit.*; 

// A simpler version of the test; no Spring. 
public final class MyApplicationTest { 
    @Tested MyApplication myApplication; 
    @Injectable String name = "one"; 
    @Injectable SomeService mockService; 

    @Test 
    public void doSomethingUsingMockedService() { 
     new Expectations() {{ mockService.doSomething(); result = "two"; }}; 

     String result = myApplication.doSomething(); 

     assertEquals("one two", result); 
    } 
} 
+0

Спасибо - исследуем этот подход. – FrVaBe

+0

К сожалению, это не сработает, если при инициализации Spring Context требуется экземпляр mock. Возникает вопрос: как сгенерировать jmockit mock instance с определенным поведением вне тестов? – FrVaBe

+0

Издевательские API-интерфейсы предназначены только для использования * внутри *. Но мне непонятно, в чем проблема. Являются ли методы Spring * call * для beans во время инициализации контекста? –

2

Spring-ReInject предназначен для замены бобы с помощью издевательств.

+0

Интересно, но в моем случае есть специальный тест Spring Configurat и может генерировать макет на месте (нет необходимости что-то переписывать). Если возможно, я бы предпочел эту попытку, но если бы я не мог глубже взглянуть на вашу библиотеку. Спасибо и +1 на данный момент! – FrVaBe