2015-08-05 37 views
6

W mojej wiosennej aplikacji startowej mam komponent bean usługi (z adnotacją @Service) i chcę wyśmiać tę usługę w konkretnym teście JUnit (nie we wszystkich testach). Jak mogę zastąpić tę fasolę serwisową tylko dla jednego konkretnego testu?Spring - zamień @Service bean w teście

usługi zadeklarowane jako:

@Service 
public class LocalizationServiceImpl implements LocalizationService { 
    ... 
} 

App klasa konfiguracja:

@Configuration 
@EnableAutoConfiguration 
@ComponentScan(basePackages="my.package") 
@EntityScan 

public class Application { 
... 
} 

klasa Test:

@Transactional 
@SpringApplicationConfiguration(classes = LocalizationServiceTest.LocalizationServiceTestConfig.class) 
public class LocalizationServiceTest extends ESContextTest { 

    @Autowired 
    private LocalizationService locService; 

    @Configuration 
    public static class LocalizationServiceTestConfig { 

     @Bean 
     public LocalizationService localizationServiceImpl() { 
      return mock(LocalizationService.class); 
     } 

    } 
} 

I klasa Test parent:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
public abstract class ESContextTest { 
... 
} 

Ale to nie działa. Po uruchomieniu testu oryginalna wersja LocalizationServiceImpl jest używana do autowyredacji właściwości locService. Pojawiło się w pliku dziennika: Pomijanie definicji komponentu bean dla [BeanMethod: name = localizationService, declarationingClass = ... LocalizationServiceTest $ LocalizationServiceTestConfig]: definicja dla bean 'localizationService' już istnieje. Ta definicja komponentu najwyższego poziomu jest uważana za zastąpienie.

Gdy używam innej nazwy dla metody @Bean w LocalizationServiceTestConfig np. localizationServiceMock() (aby się różnić od oryginalnej nazwy klasy implementacji), a następnie wiosną rzuca

'No qualifying bean of type is defined: expected single matching bean but found 2: localizationServiceImpl,localizationServiceMock' 

Pomyślałem więc prawdą jest użycie tej samej nazwy.

rozwiązanie Tylko praca jest usunięcie @Service adnotacji z klasy LocalizationServiceImpl i utworzyć konfigurację normalny (nie przetestować) APP Run Like

@Configuration 
public class BeansConfig { 
    @Bean 
    public LocalizationService localizationServiceImpl() { 
     return new LocalizationServiceImpl(); 
    } 
} 

potem w próbie uruchomienia makiety poprawna implementacja jest autowired.

Ale powinno być możliwe zrobić to samo za pomocą adnotacji @Service, nie powinno?

Dzięki za porady.

Odpowiedz

9

Znaleziono rozwiązanie samodzielnie: zmień nazwę na localizationServiceImpl() np. do localizationServiceMock() w klasie LocalizationServiceTestConfig i dodaj adnotację do metody za pomocą @Primary.

Ale dlaczego po prostu redefiniowanie fasoli o tym samym "id" nie działa tak jak w xml-config?