Mockito JUnit5 ile nasıl kullanılır


113

Mockito ve JUnit 5 ile enjeksiyonu nasıl kullanabilirim?

JUnit4'te @RunWith(MockitoJUnitRunner.class)Ek Açıklamayı kullanabilirim . JUnit5'te @RunWithEk Açıklama yok mu?

Yanıtlar:


159

Mockito'yu kullanmanın farklı yolları var - bunların üzerinden birer birer geçeceğim.

El ile

Mockito::mockJUnit sürümünden (veya bu konuda test çerçevesinden) bağımsız olarak çalışmalarda manuel olarak alay oluşturma .

Ek Açıklamaya Dayalı

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).

Mockito Uzantısı

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 MockitoExtensionbireyin 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).

Kural Yok, Koşucu Yok

JUnit 4 kuralları ve koşucuları JUnit 5'te çalışmaz, bu nedenle MockitoRuleve Mockito koşucusu kullanılamaz.


7
Artık MockitoJUnitRunner -> mockito-junit-jupiter
dan carter ile

Mockito için resmi uzantı yayınlandığında, nasıl yapılandırılacağı ve kullanılacağı hakkında daha fazla ayrıntı içeren bir blog yazısı yazdı: solidsoft.wordpress.com/2018/03/27/…
Marcin Zajączkowski

Açıklamalı yöntem @Testherkese açık olmalı mı yoksa "özel paket" yeterince iyi mi?
Geek

Jüpiter ile test çalıştırırken (genellikle "JUnit 5" olarak anılır), test yöntemlerinin yalnızca paket tarafından görülebilir olması gerekir.
Nicolai Parlog

62

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

    ...
}

7
@ExtendWith(MockitoExtension.class)eşdeğerdir @RunWith(MockitoJUnitRunner.class)JUnit4 ait
Sergey Nemchinov

JUnit5'te MockitoExtension.class kullanarak MockitoExtension.class kullanarak Mock nesnesinin yönteminde farklı dönüş değerlerine sahip yöntemin birden çok çağrısını yapabilir miyim
Raj Hassani

@RajHassani Evet yapabilirsin, buraya bakın .
Jonathan

10

org.junit.jupiter.api.extension.ExtensionYapmanı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.Extensionyolu 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-jupiteryapı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-jupiteriki 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-apiolduğunuzdan emin olun mockito-junit-jupiter.


neden mockito-junit-jupiteruygun sürümünü çekmiyor junit-jupiter-api?
haelix

@haelix Çünkü bu bağımlılık için kullanılan sürüm stratejisi Mockito kütüphanesine dayanıyor. Buradaki versiyona bakın 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.
davidxxx

MockitoExtensionmockito-core3.0.0 sürümünde mevcut görünmüyor .
Thunderforge

1
@Thunderforge Bu tanımlanırmockito-junit-jupiter
davidxxx

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.