Mockito ve JUnit 5 ile enjeksiyonu nasıl kullanabilirim?
JUnit4'te @RunWith(MockitoJUnitRunner.class)
Ek Açıklamayı kullanabilirim . JUnit5'te @RunWith
Ek Açıklama yok mu?
Mockito ve JUnit 5 ile enjeksiyonu nasıl kullanabilirim?
JUnit4'te @RunWith(MockitoJUnitRunner.class)
Ek Açıklamayı kullanabilirim . JUnit5'te @RunWith
Ek Açıklama yok mu?
Yanıtlar:
Mockito'yu kullanmanın farklı yolları var - bunların üzerinden birer birer geçeceğim.
Mockito::mock
JUnit sürümünden (veya bu konuda test çerçevesinden) bağımsız olarak çalışmalarda manuel olarak alay oluşturma .
Kullanılması @Mock -annotation ve karşılık gelen çağrıyı MockitoAnnotations::initMocks
için mocks oluşturmak bakılmaksızın JUnit sürümü çalışır (bu konuda veya test çerçevesi fakat test kodu bir modül içinde biter ya da olmasın, Java 9 bağlı olarak burada parazit yapabilir).
JUnit 5 güçlü bir uzatma modeline sahiptir ve Mockito yakın zamanda org.mockito : mockito-junit-jupiter grubu / yapı kimliği altında bir tane yayınladı .
Uzantıyı @ExtendWith(MockitoExtension.class)
, test sınıfına ekleyerek ve alay edilen alanlara ile açıklama ekleyerek uygulayabilirsiniz @Mock
. Gönderen MockitoExtension
bireyin JavaDoc'u:
@ExtendWith(MockitoExtension.class)
public class ExampleTest {
@Mock
private List list;
@Test
public void shouldDoSomething() {
list.add(100);
}
}
MockitoExtension belgeleri , örnek oluşturucu enjeksiyonu gibi taklitleri başlatmanın diğer yollarını açıklar (test sınıflarındaki son alanları yeniden kullanırsanız).
JUnit 4 kuralları ve koşucuları JUnit 5'te çalışmaz, bu nedenle MockitoRule
ve Mockito koşucusu kullanılamaz.
@Test
herkese açık olmalı mı yoksa "özel paket" yeterince iyi mi?
Mockito's kullanın MockitoExtension
. Uzantı yeni bir yapıda bulunuyor mockito-junit-jupiter
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.23.4</version>
<scope>test</scope>
</dependency>
JUnit 4 ile yapacağınız gibi testler yazmanıza izin verir:
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
@ExtendWith(MockitoExtension.class)
class MyTest {
@Mock
private Foo foo;
@InjectMocks
private Bar bar; // constructor injection
...
}
@ExtendWith(MockitoExtension.class)
eşdeğerdir @RunWith(MockitoJUnitRunner.class)
JUnit4 ait
org.junit.jupiter.api.extension.Extension
Yapmanın farklı yolları var ama daha temiz olan ve aynı zamanda JUnit 5 felsefesine de saygı duyan bir Mockito yaratmaktır .
1) El ile alay oluşturmak , çerçeveyi doğru şekilde kullandığınızdan emin olmak için ek Mockito kontrollerinin avantajını kaybetmenize neden olur.
2) MockitoAnnotations.initMocks(this)
Her test sınıfında arama , önleyebileceğimiz kazan plakası kodudur.
Ve bu kurulumu soyut bir sınıfta yapmak da iyi bir çözüm değil.
Her test sınıfını bir temel sınıfa bağlar.
O zaman iyi nedenlerle yeni bir temel test sınıfına ihtiyacınız varsa, 3 seviyeli bir sınıf hiyerarşisi ile bitirirsiniz. Lütfen bundan kaçının.
3) Test Kuralları bir JUnit 4 özgüllüğüdür.
Bunu düşünme bile.
Ve belgeler bu konuda net:
Bununla birlikte, JUnit 5 için yeni bir uzantı geliştirmeyi düşünüyorsanız, lütfen JUnit 4'ün kural tabanlı modeli yerine JUnit Jupiter'in yeni uzantı modelini kullanın.
4) Test Runner, JUnit 5 çerçevesini genişletmenin gerçekten bir yolu değildir.
JUnit 5, JUnit 5 Extensions sayesinde test yazmak için bir uzatma modeli sağlayarak JUnit 4'ün Runners cehennemini basitleştirdi.
Bunu düşünme bile.
Bu yüzden org.junit.jupiter.api.extension.Extension
yolu tercih edin .
DÜZENLEME: Aslında, Mockito bir jüpiter uzantısını paketler: mockito-junit-jupiter
Ardından, kullanımı çok basit:
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class FooTest {
...
}
İşte Jonathan'ın mükemmel cevabına bir ek.
Bağımlılık olarak mockito-junit-jupiter
yapıyı ekleyerek @ExtendWith(MockitoExtension.class)
, test yürütülürken aşağıdaki istisnanın kullanımı üretilir:
java.lang.NoSuchMethodError: org.junit.platform.commons.support.AnnotationSupport.findAnnotation (Ljava / util / Opsiyonel; Ljava / lang / Class;) Ljava / util / Opsiyonel;
Sorun, mockito-junit-jupiter
iki bağımsız kütüphaneye bağlı olmasıdır. Örneğin mockito-junit-jupiter:2.19.0
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.19.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.1.0</version>
<scope>runtime</scope>
</dependency>
Sorun benim kullandım junit-jupiter-api:5.0.1
.
Bu nedenle junit-jupiter-api
, API açısından hala sık sık hareket ettiği için, bunun aynı sürümüne bağlı junit-jupiter-api
olduğunuzdan emin olun mockito-junit-jupiter
.
mockito-junit-jupiter
uygun sürümünü çekmiyor junit-jupiter-api
?
mockito-junit-jupiter:2.19.0
. JUnit Jüpiter versiyonları ile başlar 5
. mockito-junit-jupiter, işleri daha net hale getirmek için artefakt tanımlayıcısında iki şeyi (Mockito sürümü ve JUnit Jupiter sürümü) belirtmiş olmalıdır. Örneğin mockito-junit-jupiter-5.1:2.19.0
, kütüphanenin JUnit Jupiter 5.1 için tasarlandığını iletmek için.
MockitoExtension
mockito-core
3.0.0 sürümünde mevcut görünmüyor .
mockito-junit-jupiter
Yeni @ExtendWith
açıklamayı kullanmanız gerekir .
Maalesef henüz bir uzantı yok. Açık github uzantı için bir beta uygulamasını görebilirsiniz. örnek bir demo testi olarak .