SORU
27 HAZİRAN 2009, CUMARTESİ


Neden jUnit'statik fixtureSetup s gerekir?

JUnit @bu açıklama BeforeClass ve bu durum statik olması gerektiğini söyleyerek, var olan bir yöntem işaretledim. Mantığı ne? Bunların hepsi benim init iyi bir neden gördüğüm kadarıyla statik alanları olmaya zorlar.

.Net (NUnit), bu durum böyle değil.

Edit- aslında bu bir yöntem açıklamalı ile @BeforeClass çalışır sadece bir kez ilgisi yok olmasının bir statik yöntem - tek bir statik olmayan yöntem çalıştırmak sadece bir kez (NUnit).

CEVAP
28 Temmuz 2010, ÇARŞAMBA


JUnither zaman@her bir Test yöntemi için test sınıfının bir örneğini oluşturur. Daha kolay yan etkisi olmayan testleri yazmak için This is a fundamental design decision. İyi testler herhangi bir emri çalıştırın bağımlılıklar (F.I.R.S.T) ve test sınıf taze örnekler oluşturma ve her test için örnek değişkenleri bu elde etmek için çok önemli. Bazı test çerçeveler yanlışlıkla testler arasında yan etki oluşturma olasılıkları daha fazla yol açan tüm testler için aynı test sınıf örneği yeniden.

Ve her test yöntemi kendi kopyasını sahip olduğundan, @@/BeforeClass AfterClass yöntemleri örnek yöntemleri için hiç mantıklı değil. Aksi halde, hangi sınıf test örnekleri üzerinde yöntemleri aranmalıdır? Eğer referans örnek değişkenleri @BeforeClass/@AfterClass yöntemleri için mümkün olurbu sadece bir Test @yöntemleri aynı örnek değişkenleri erişim olurdu o zaman- geri kalan varsayılan değerlerine örnek değişkenleri olurdu - ve @rastgele Test yöntemi, bu yöntemleri sırası çünkü seçilmiş olur .sınıf dosyası derleyici bağımlı (IIRC, Java yansıma API olarak bildirilir ve aynı sırada yöntemleri döndürür ./belirtilmemiş sınıf dosyası, davranış belirsiz de olsa - aslında satır numaralarını sıralamak için a library yazdım).

Bu yöntem, statik olarak uygulayan tek mantıklı çözüm.

İşte bir örnek:

public class ExampleTest {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("beforeClass");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("afterClass");
    }

    @Before
    public void before() {
        System.out.println(this   "\tbefore");
    }

    @After
    public void after() {
        System.out.println(this   "\tafter");
    }

    @Test
    public void test1() {
        System.out.println(this   "\ttest1");
    }

    @Test
    public void test2() {
        System.out.println(this   "\ttest2");
    }

    @Test
    public void test3() {
        System.out.println(this   "\ttest3");
    }
}

Yazdıran:

beforeClass
ExampleTest@3358fd70    before
ExampleTest@3358fd70    test1
ExampleTest@3358fd70    after
ExampleTest@6293068a    before
ExampleTest@6293068a    test2
ExampleTest@6293068a    after
ExampleTest@22928095    before
ExampleTest@22928095    test3
ExampleTest@22928095    after
afterClass

Gördüğünüz gibi, bu testlerin her biri kendi örneği ile yürütülür. JUnit ne temelde bu aynıdır:

ExampleTest.beforeClass();

ExampleTest t1 = new ExampleTest();
t1.before();
t1.test1();
t1.after();

ExampleTest t2 = new ExampleTest();
t2.before();
t2.test2();
t2.after();

ExampleTest t3 = new ExampleTest();
t3.before();
t3.test3();
t3.after();

ExampleTest.afterClass();

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • Trulia

    Trulia

    29 Kasım 2006