SORU
27 Ocak 2009, Salı


Bağlayıcı geçersiz kılma Guice

Sadece Guice ile oynamaya başladım ve bir durum düşünemiyorum testinde sadece tek bir bağlayıcı geçersiz kılmak istiyor. Üretim düzeyi bağlamaları geri kalan her şey Kur doğru olduğunu sağlamak ve tekrarını önlemek için isterim.

Bu yüzden aşağıdaki Modül var düşünün

public class ProductionModule implements Module {
    public void configure(Binder binder) {
        binder.bind(InterfaceA.class).to(ConcreteA.class);
        binder.bind(InterfaceB.class).to(ConcreteB.class);
        binder.bind(InterfaceC.class).to(ConcreteC.class);
    }
}

Ve benim test ben sadece inceliğini İnterfaceA ve İnterfaceB tutarken İnterfaceC geçersiz kılmak istiyorum, şöyle bir şey istiyorum:

Module testModule = new Module() {
    public void configure(Binder binder) {
        binder.bind(InterfaceC.class).to(MockC.class);
    }
};
Guice.createInjector(new ProductionModule(), testModule);

Ayrıca aşağıdaki, hiç şans denedim:

Module testModule = new ProductionModule() {
    public void configure(Binder binder) {
        super.configure(binder);
        binder.bind(InterfaceC.class).to(MockC.class);
    }
};
Guice.createInjector(testModule);

Herkes mümkünse benim istediğim ne varsa biliyor mu, yoksa tamamen yanılıyor muyum??

--- Takip: Öyle görünüyor, ben de arzu ne istersem yaparım kullanımının @İmplementedBy etiketi arayüzü ve sadece sağlamak bir bağlama test çalışması, hangi işleri ne zaman güzel bir 1-1 eşleme arasında arayüz ve uygulama.

Ayrıca, bütün bir modülü geçersiz kılma ve bizim modülleri var sağlamanın yolu baş aşağı oluruz görünüyor ki, bir meslektaşı ile görüştükten sonra doğru tanımlanmamış. Bu gibi görünüyor olabilir neden bir sorun olsa bir bağlama yersiz bir modül ve gerekli taşındı, böylece muhtemelen kırma bir yük testleri gibi bağlantıları olabilir artık kullanılabilir için geçersiz.

CEVAP
10 ŞUBAT 2009, Salı


Bu aradığınız cevabı olmayabilir, ama eğer birim testleri yazarken, muhtemelen bir enjektör kullanarak olmamalı ve el ile sahte veya sahte nesneleri enjekte değil.

Eğer gerçekten bir tek bağlayıcı değiştirmek istiyorsanız, diğer taraftan,, Modules.override(..) kullanabilirsiniz:

public class ProductionModule implements Module {
    public void configure(Binder binder) {
        binder.bind(InterfaceA.class).to(ConcreteA.class);
        binder.bind(InterfaceB.class).to(ConcreteB.class);
        binder.bind(InterfaceC.class).to(ConcreteC.class);
    }
}
public class TestModule implements Module {
    public void configure(Binder binder) {
        binder.bind(InterfaceC.class).to(MockC.class);
    }
}
Guice.createInjector(Modules.override(new ProductionModule()).with(new TestModule()));

Detaylar here bkz.

Ama Modules.overrides(..) javadoc önerir gibi, bağlantılar geçersiz kılmak için gerek yok böyle bir şekilde modüller dizayn etmelisiniz. Verdiğin örnekte, ayrı bir modül için InterfaceC bağlama taşıyarak elde edebilirsin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • Kontor.TV

    Kontor.TV

    14 Mart 2006
  • Nick Pitera

    Nick Pitera

    8 NİSAN 2006