2013-02-04 15 views
5

Benim Bahar Java yapılandırmasında bu fasulye var:Test için kapsamlı bir fasülyeyi nasıl geçersiz kılarım?

@Bean 
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value=SpringScopes.DESKTOP) 
public BirtSession birtSession() { 
    return new BirtSession(); 
} 

testleri için, ben (hayır "Masaüstü" kapsam testinde yoktur) bir kapsam olmadan bir taklidini gerekir. Ama yukarıdaki yapılandırmayı ithal ve içerdiği benim test için bir yapılandırma oluştururken:

@Bean 
public BirtSession birtSession() { 
    return new MockSession(); 
} 

ben :-(

Ben bahar yaparım'ı @Scope "unutmak" a "Masaüstü" kapsamlı alay fasulye olsun ? ek açıklama

PS:. Ben @Import kullanmak ve & kopyalayıp yapıştırarak kullanabilirsiniz ama bunu yapmak istemiyorum yok zaman çalışır

+0

yazıyorsun testin ne tür @ImportResource. ile ithal edilebilir? Ünite testi? –

+1

@ Birincil ile? * Bazı "DESKTOP" kapsamı mevcut olmalı, ancak otomatik kablolama her zaman birincil fasulye seçecektir. –

+0

@JBNizet: Evet, 'SpringJUnit4ClassRunner' –

cevap

1

sorun kapsamlı fasulye tanımını oluşturmak için ScopedProxyCreator.createScopedProxy() statik yöntemini kullanan ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod() gibi görünüyor: Bir RootBeanDefinition yerine ConfiguratioClassBeanDenition ait kapsamlı vekil fasulye tanımı BeanDefinitionHolder getirileri de

// replace the original bean definition with the target one, if necessary 
     BeanDefinition beanDefToRegister = beanDef; 
     if (proxyMode != ScopedProxyMode.NO) { 
      BeanDefinitionHolder proxyDef = ScopedProxyCreator.createScopedProxy(
        new BeanDefinitionHolder(beanDef, beanName), this.registry, proxyMode == ScopedProxyMode.TARGET_CLASS); 
      beanDefToRegister = proxyDef.getBeanDefinition(); 
    } 

(yani ScopedProxyFactoryBean) başka bir Java Yapılandırma sınıfı tarafından geçersiz kılınamaz.

ilişkin bir çözüm, xml yapılandırma dosyasında geçersiz kılmak için kapsamlı fasulye ilan ve

+0

Bu bir hata/özellik gibi geliyor. Bu kasıtlı mı yoksa bir hata olarak mı rapor etmeliyim? –

+0

Bence bu bir hatadır. ConfigurationClassBeanDefinitionReader, Bean tanımının harici olarak oluşturulup oluşturulmadığını belirlemek için kendi BeanDefinition sınıfına sahip olduğu için RootBeanDefinitions'ı kaydettirmemelidir. –

+0

Neye uğradığını bildiğinizi düşündüğünüzden bu hatayı bildirmeniz gerektiğini düşünüyorum :-) Lütfen cevabın URL'sini ekledikten sonra yorum olarak ekleyin. –

0

ek açıklama tutmak Bahar değil sorun, Probl em, ilk önce "üretken" yapılandırmayı ayrıştırmaya çalışır ve bunu yapmak için kapsamın kullanılabilir olup olmadığını kontrol eder. Bahar kontrol hevesle kapsamaktadır. Dolayısıyla, ikinci/geçersiz kepek tanımına asla ulaşmaz.

import java.util.HashMap; 
import java.util.Map; 
import org.springframework.beans.factory.ObjectFactory; 

public class MockSpringScope implements org.springframework.beans.factory.config.Scope { 

    private Map<String, Object> objects = new HashMap<String, Object>(); 

    @Override 
    public Object get(String name, ObjectFactory<?> objectFactory) { 
     Object result = objects.get(name); 
     if(null == result) { 
      result = objectFactory.getObject(); 
      objects.put(name, result); 
     } 
     return result; 
    } 

    @Override 
    public Object remove(String name) { 
     return objects.remove(name); 
    } 

    @Override 
    public void registerDestructionCallback(String name, Runnable callback) { 
     // NOP 
    } 

    @Override 
    public Object resolveContextualObject(String key) { 
     // NOP 
     return null; 
    } 

    @Override 
    public String getConversationId() { 
     // NOP 
     return null; 
    } 

} 

ve "Masaüstü" kapsam olarak çerçevesinde bu kayıt:

bir kukla kapsamını oluşturun. Spring, üretim yapılandırmasını başarılı bir şekilde ayrıştırmaya izin verir.