Çevrimiçi işlevselliğe sahip birim test sınıfları


23

Çevrimiçi fonksiyonellik gerektiren özel fonksiyonlara sahip bir sınıfın fonksiyonlarını test ederken. Biri nasıl test edilir?

Örneğin:

public class Foo
{
    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        CloudService c = new CloudService();
        int oval = c.getValueFromService();
        return oval;
    }
}

Eğer işlevi sınamak isteseydim: 'methodA ()', bu işlevsellik yapılmadıysa, ancak çevrimiçi olmayı deneyecek olan 'goOnlineToGetVal ()' kullanmaya çalışırdı. Çevrimiçi olmadan% 100 Sınıf kapsamını nasıl geçebilirim?


Metodunuz sadece cloud api mi diyor yoksa ek olarak da çalışıyor mu?
Winston Ewert,


4
Bağımlılık Enjeksiyonu?
PhaDaPhunk 16:14

Yanıtlar:


76

new CloudService()

Ve işte problemin.

Modern OO tasarımı, bu tür bir bağımlılığın doğrudan inşa edilmek yerine aktarılmasını önerir . Bu, işlevin kendisine veya inşaat zamanında sınıfa geçirilebilir. Bu tür bir karmaşıklığın garanti edilmesi durumunda, bir Inversion of Control konteyneri tarafından da tutulabilir veya toplanabilir.

Bu noktada, sınama sırasında "çevrimiçi" verilerinizi sağlamak için sahte / sahte bir hizmete geçmek oldukça önemsiz hale geliyor. Daha da iyisi, yazılımınızın yeterince esnek olmasına izin verir, böylece bazı (devlet) müşterilerinin gelmesi ve bulutun değerleri için kullanılması istememesi durumunda hızlı bir şekilde adapte olabilirsiniz. Veya bir bulut sağlayıcısını diğeri için terk etmek istiyorsunuz. Veya...


7
Sanırım Bağımlılık Enjeksiyonunun ne olduğunu anlama konusunda çok daha yakınlaştığımı düşünüyorum.
marczellm

Uygulamamın ihtiyaç duyduğu tüm örnekleri oluşturmak için en iyi yer neresidir? Başvurumun üst kısmına mümkün olduğunca yakın? Bağımlılık enjeksiyonunu yalnızca şimdiye kadar uygulayabilirsiniz; Bir noktada, örnekleri argüman olarak iletmek yerine, kendiniz yaratmanız gerekir.
Paul

3
@ Paul - Bu değişir. Tecrübelerime göre uygulamalar genellikle ikili ağaçlara benziyor - bir sınıf / fonksiyon / modül daha karmaşık davranışlar sağlamak için ikisini birbirine yapıştırıyor. Bu "yapıştırıcı" sınıflarından biri, daha sonra büyük parçaları birbirine yapıştırmak için giriş noktanıza gelinceye kadar ... sırayla onu başka bir şeyle yapıştırmak için kullanılan, somut uygulamayı belirleyen sınıftır. tutarlı. "En iyi" yer, kodunuzu yapmanız veya yapmaması gereken şeyleri bilmeden yapması gerekeni yapmasına izin veren yerdir. Değişecektir.
Telastyn 16:14

2
@Paul Genellikle uygulamanız doğrudan test edilen ve bu tür bağımlılık enjeksiyonunu ve uygulamaya özel kodu kullanması gereken bir "kütüphane" arasında bölünmüştür. Sonuncusu genellikle doğrudan kullanıcı tarafından sağlanan verileri içeren kitaplığı çağıran bir GUI'ye, bir miktar web servisine ya da bir komut satırı arabirimine kaynar. Temel olarak, uygulamaya özel kod, bağımlılık enjeksiyonlu kütüphanenin beklediği somut uygulamaları yaratacaktır.
Darkhogg

@Paul Castle Windsor, StructureMap, Ninject ve Unity gibi IoC konteynerlerine bir göz atın. Bağımlılık enjeksiyonunu yapmanın tek yolu onlar değildir, ancak yukarıdan aşağıya bir nesne grafiği oluşturma hakkında düşünme konusunda çok bilgilendirici olabilirler
Ben Aaronson

37

Bunu böyle uygulardım:

public class Foo
{
    private ICloudService cloudService;

    public Foo(ICloudService s)
    {
       cloudService=s;
    }

    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        int oval = cloudService.getValueFromService();
        return oval;
    }
}

Arayüz ICloudService, test için sahte bir cihazla veya "gerçek" bulut servisi ile uygulanabilir. Başlatma new CloudService(), her çağrı için zorunlu getValueFromServiceveya CloudServicedeğiştirilemeyen bir 3. taraf API'den geliyorsa ICloudService, uygun çağrılardan türetilen ve yapılan bir sarıcı uygulayın .


1
Bu kesinlikle gitmenin yolu. Size testin mutlak kontrolünü veren bir arayüzle dalga geçebilen sınıf kütüphaneleri vardır.
Greg Burghardt,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.