2015-05-04 5 views
0

Я хочу проверить услугу А, который имеет метод methodA1, А относится к услуге В, который имеет метод methodB1,весной тест с обслуживанием разница фасоли

В methodB1 называется в methodA1,

@Service 
class A{ 
    @Autowired 
    B b; 
    void methodA1{ 
     .... 
     b.methodB1(); 
     ..... 
    } 
} 

@Service 
class B{ 

    void methodB1{ 
     .... 
    } 
} 

Теперь я хочу протестировать методA1, но методB1 нужно переопределить, поэтому я создаю новый класс BMock;

@Service("bMock") 
class BMock execute B{ 
    @Override 
    void methodB1{ 
    .... 
    } 
} 

Тестовый пример, как это:

class testClass extends springTest{ 

    @Autowired 
    A a; 

    @Autowired 
    @Qualifier("bMock") 
    B b; 

    @Test 
    public void testMethodA1(){ 
     a.methodA1(); 
    } 
} 

собственно, methodA1 всегда называют methodB1 в классе B, я хочу его называть BMock в тесте, как это сделать?

+0

Почему бы не использовать фреймворки, такие как easymock/powermock/mockito и т. Д., Чтобы издеваться? – SMA

+0

'@Qualifier (« bMock »)' в этом случае не собирается делать (AFAIK). Вы интерфейсы. Вместо того, чтобы конкретизировать 'B b'use' AnInterfaceThatBImplements b' – Shahzeb

+0

@Shahzeb, значит, мне нужно создать интерфейс Ib, интерфейс класса B и BMock Ib? если это так, bMock можно вызвать в тестовом случае? – Mike

ответ

0

Spring Re-Inject может использоваться для замены бобы с помощью издевательств в тестовой среде.

@ContextConfiguration(classes = {ReInjectContext.class, testClass.TextContext.class}) 
class testClass extends springTest { 
    @Autowired 
    A a; 

    // Spring context has a bean definition for B, but it is  
    // overridden in the test's constructor, so BMock is created 
    // instead of B. BMock gets injected everywhere, including A and the 
    // test 
    @Autowired 
    B b; 
    public testClass() { 
      // Replace bean with id "b" with another class in constructor 
      // "b" is bean ID that Spring assigns to B 
      ReInjectPostProcessor.inject("b", BMock.class); 
    } 

    @Test 
    public void testMethodA1(){ 
     a.methodA1(); 
    } 

    // If A and B are already the part of Spring context, this config 
    // is not needed 
    @Configuration 
    static class TestContext { 
     @Bean public A a() { return new A(); } 
     @Bean public B b() { return new B(); } 
    } 
} 

И удалить @Qualifier и @Service из BMock

0

Если у вас есть сеттера для b в классе А, переопределить его явно в тесте:

class testClass extends springTest{ 

    @Autowired 
    A a; 

    @Autowired 
    @Qualifier("bMock") 
    B b; 

    @Test 
    public void testMethodA1(){ 
     a.setB(b); 
     a.methodA1(); 
    } 
} 

Если у вас нет сеттер (и не хотите его создавать), вы можете использовать отражение:

Field bField = A.getDeclaredField("b"); 
fField.setAccessible(true); 
fField.set(a, b); 

Это ломается, это но может быть приемлемым для теста.