Yanıtlar:
@Assylias'a, kullanmanın @BeforeClass
klasik bir çözüm olduğu konusunda hemfikir olsam da her zaman uygun değildir. Açıklanan yöntem @BeforeClass
statik olmalıdır. Test senaryosu örneğine ihtiyaç duyan bazı testler için çok sakıncalıdır. Örneğin @Autowired
, yay bağlamında tanımlanan hizmetlerle çalışmak için kullanılan Yay tabanlı testler .
Bu durumda, kişisel olarak setUp()
açıklama eklenmiş normal yöntemi kullanıyorum @Before
ve özel static
(!) boolean
Bayrağımı yönetiyorum :
private static boolean setUpIsDone = false;
.....
@Before
public void setUp() {
if (setUpIsDone) {
return;
}
// do the setup
setUpIsDone = true;
}
setUp()
yöntemin bir üst sınıfta olduğu durum dışında çalışır - bu sorunu çözmek için aşağıda bir yanıt gönderdik .
Sen kullanabilirsiniz ek açıklama :BeforeClass
@BeforeClass
public static void setUpClass() {
//executed only once, before the first test
}
TheClassYouWant.class
GetClass () çağrınız yerine kullanamayacağınızdan emin misiniz ? Bu gerçek bir Java geçerli: String.class.getName()
.
JUnit 5 artık @BeforeAll ek açıklamasına sahip:
Açıklamalı yöntemin, geçerli sınıf veya sınıf hiyerarşisindeki tüm @Test yöntemlerinden önce yürütülmesi gerektiğini belirtir; JUnit 4'ün @BeforeClass'a benzer. Bu tür yöntemler statik olmalıdır.
JUnit 5'in yaşam döngüsü ek açıklamaları sonunda doğru yapmış gibi görünüyor! Bakmadan bile hangi ek açıklamaların mevcut olduğunu tahmin edebilirsiniz (örneğin @BeforeEach @AfterAll)
@BeforeClass
, olması gerekiyordu static
. IMO @ AlexR'nin çözümü daha güzel.
Ne zaman setUp()
bir test sınıfın bir üst sınıfta (örneğin AbstractTestBase
aşağıdaki gibi altı) kabul cevap değiştirilebilir:
public abstract class AbstractTestBase {
private static Class<? extends AbstractTestBase> testClass;
.....
public void setUp() {
if (this.getClass().equals(testClass)) {
return;
}
// do the setup - once per concrete test class
.....
testClass = this.getClass();
}
}
Bu, statik olmayan tek bir setUp()
yöntem için çalışmalı, ancak tearDown()
karmaşık bir yansıma dünyasına girmeden bir eşdeğer üretemiyorum ... Ödül yapabilen herkese işaret ediyor!
Düzenleme: Hata ayıklarken, sınıfın da her testten önce başlatıldığını öğrendim. Sanırım @BeforeClass ek açıklaması burada en iyisi.
Sen de yapıcı kurabilirsiniz, test sınıf olan bir sınıf sonuçta. Bunun kötü bir uygulama olup olmadığından emin değilim çünkü neredeyse tüm diğer yöntemler açıklanmış durumda, ama işe yarıyor. Bunun gibi bir kurucu oluşturabilirsiniz:
public UT () {
// initialize once here
}
@Test
// Some test here...
Ctor, statik olmadıkları için testlerden önce çağrılacaktır.
Bu çözümü deneyin: https://stackoverflow.com/a/46274919/907576 :
@BeforeAllMethods
/ @AfterAllMethods
annotation ile , tüm enjekte edilen değerlerin mevcut olduğu bir örnek bağlamında Test sınıfındaki herhangi bir yöntemi çalıştırabilirsiniz.
Kirli çözümüm:
public class TestCaseExtended extends TestCase {
private boolean isInitialized = false;
private int serId;
@Override
public void setUp() throws Exception {
super.setUp();
if(!isInitialized) {
loadSaveNewSerId();
emptyTestResultsDirectory();
isInitialized = true;
}
}
...
}
Bunu tüm test durumlarım için temel olarak kullanıyorum.
Her alt testte ayarlanmış ve kontrol edilmiş bir değişkenin bildirimini zorlamak istemiyorsanız, bunu bir SuperTest'e eklemek şunları yapabilir:
public abstract class SuperTest {
private static final ConcurrentHashMap<Class, Boolean> INITIALIZED = new ConcurrentHashMap<>();
protected final boolean initialized() {
final boolean[] absent = {false};
INITIALIZED.computeIfAbsent(this.getClass(), (klass)-> {
return absent[0] = true;
});
return !absent[0];
}
}
public class SubTest extends SuperTest {
@Before
public void before() {
if ( super.initialized() ) return;
... magic ...
}
}
Bu sorunu şu şekilde çözdüm:
Senin ekleyin Taban soyut sınıfı (daki sürücüsünü başlatmak Acımasız soyut sınıf setUpDriver () bu kod parçası yöntemi):
private static boolean started = false;
static{
if (!started) {
started = true;
try {
setUpDriver(); //method where you initialize your driver
} catch (MalformedURLException e) {
}
}
}
Ve şimdi, test sınıflarınız Base soyut sınıftan genişleyecekse -> setUpDriver () yöntemi ilk @Test'ten önce çalıştırma başına yalnızca BİR kez çalıştırılacaktır.
Tüm başlatma işlerini yapmak için Spring'in @PostConstruct yöntemini kullanın ve bu yöntem herhangi bir @ Test yürütülmeden önce çalışır.