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
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();
Neden ThreadLocal deÄŸiÅŸkenler statik J...
Neden nesne yerine bir işaretçi kendis...
Neden C programcıları 'yeni kulla...
Neden Java statik olarak bir sınıf bil...
Neden't statik yöntemler Java'da ...