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.