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.