2013-04-12 19 views
11

Bileşen taraması ile fooBean doğrudan ve barBean sağlayan bir java yapılandırma sınıfım var.Bileşen taramasıyla keşfedilen bir fasulyeyi geçersiz kılacak bir yol var mı?

@Configuration 
@ComponentScan(basePackages = { "com.blah" }) 
public class Config { 

    @Bean 
    public FooBean fooBean { 
     return new FooBean(); 
    } 
} 

ve ben test durumda yeniden kullanmak istiyorum ve mocks ile fasulye değiştirmeniz gerekiyor: çok duyu Config'i yeniden yapmaz

@Configuration 
@Import(Config.class) 
public class TestConfig { 

    @Bean 
    public FooBean fooBean { 
     return new FooBeanMock(); 
    } 

    @Bean 
    public BarBean barBean { 
     return new BarBeanMock(); 
    } 
} 

(burada, ama gerçek hayatta 1000 tane fasulye var ve sadece birkaç tane alay etmem gerekiyor)

Burada fooBean geçersiz kılınır, ancak barBean değil.

Skipping loading bean definition for %s: a definition for bean " + "'%s' already exists. This is likely due to an override in XML. 

bunun için resmi bir mesele de var: https://jira.springsource.org/browse/SPR-9682

birileri bileşeni taraması tarafından keşfedilen bir fasulye etkisiz hale getirmenin bir geçici çözüm biliyor mu? Fasulyenin eski kod olduğunu ve değiştirilemediğini ve bağımlılıkları için NO belirleyicileri olduğunu (özel nitelikler + @Resource) göz önünde bulundurarak

cevap

4

gereksiz fasulye atlamak için deneyin:

@ComponentScan(basePackages = { "com.blah" }, excludeFilters = @Filter({UnnecessaryBean1.class, UnnecessaryBean2.class})) 
+0

Onları ana yapılandırmada atlayamıyorum. çünkü fasülyeye ihtiyacım var ve bu fasülyeyi somutlaştırmak için başka bir olasılık görmüyorum çünkü "Fasulye eskiden olduğu ve değiştirilemediği göz önüne alındığında ve bağımlılıkları için hiçbir belirleyici yok (özel nitelikler + @Resource). ". Ana konfigürasyonu ithal eden test konfigürasyonunda, herhangi bir anlam ifade etmemektedir, çünkü ithal edilen ana konfigürasyondan gelen taramayı herhangi bir şekilde gerçekleştirecektir. – mmoossen

+1

Ana yapılandırmanızı iki parçaya ayırabilirsiniz: 1) bileşen taraması 2) diğer her şey. Ve sonra test yapılandırmanızda sadece ikinci olanı içe aktarın. Bu yüzden testler için aleve bağlı bileşen tarama ayarlarını geçersiz kılacaksınız. –

+0

bunu yapabilir. fikir için teşekkürler. deneyeceğim. – mmoossen

0

Evet bileşen taraması tarafından keşfedilen fasulye geçersiz kılabilir. Bunu test durumlarında yapıyorum. XML konfigürasyonunu kullanıyorum ama Java Yapılandırması ile çok benzer olacağını düşünüyorum.

spring.xml: Test klasöründe

<context:component-scan base-package="cz.backend"/> 

MyBeanImpl.java

@Component("myBean") 
public class MyBeanImpl implements MyBean { 
    //Something 
} 

ben:

yay test.xml:

<import resource="classpath:/spring.xml"/> 
<bean id="myBean" class="cz.backend.MyBeanTestMock"/> 

MyBeanTestMock.java: geçersiz kılma fasulye

public class MyBeanTestMock implements MyBean { 
    //Something 
} 

Adı aynı olmalıdır.

+0

problem, bileşen-taramalı ve açık xml-konfigürasyonunun kombinasyonunu tarif ettiği gibiydi. Resmi hatada gördüğünüz gibi – mmoossen

+0

, 4.2 sürümünde ele alınmış ve çözülmüştür. – mmoossen