2013-03-18 20 views
8

Mockito kullanarak birim testleri yapıyorum ve enjekte edilen sınıflarla alay etme konusunda sorun yaşıyorum. Sorun, enjekte edilen sınıfların ikisinin aynı tip olması ve sadece @Qualifier ek açıklamalarıyla ayırt edilmesidir. Eğer sadece SomeClass.class ile dalga geçmeye çalıştıysam, bu sahte enjekte edilmez ve bu testlerimde o nesne null olur. Bu nesnelerle nasıl dalga geçebilirim? Eğer ek açıklama kullanmazsanızMockito ile aynı türde iki nesneyi gezinme

public class ProfileDAL { 

    @Inject 
    @Qualifier("qualifierA") 
    private SomeClass someClassA ; 

    @Inject 
    @Qualifier("qualifierB") 
    private SomeClass someClassB ; 

    //...various code, not important 
} 

@RunWith(MockitoJUnitRunner.class) 
public class ProfileDALLOMImplTest { 

    @InjectMocks 
    private ProfileDALLOMImpl profileDALLOMImpl = new ProfileDALLOMImpl(); 

    @Mock 
    private SomeClass someClassA; 
    @Mock 
    private SomeClass someClassB; 

    private SomeResult mockSomeResult = mock(SomeResult.class); 

    @Test 
    public void testSomeMethod() { 
     when(someClassA .getSomething(any(SomeArgment.class)).thenReturn(mockSomeResult); 
     Int result = profileDALLOMImpl.someTest(This isn't relevant); 
    } 

} 
+0

görünüyor:

Yani, sizin durumda, size testinde sınıfta aynı adı taşıyan alay sınıfların ikisine de sahip emin olun? Ben alaylarımı oluşturmak için her zaman açıkça "Mockito.mock (SomeClass.class)" yi çağırıyorum, ünitemden uzak durmak ek açıklamalarla sağlanan herhangi bir sihiri test eder. Bağımlılıklarınızı kurucu veya ayarlayıcılarla enjekte ederseniz, aynı şeyi yapabilmelisiniz. Durumun iyi bir nedeni var mı? – rcomblen

+0

Bu bağımlılıkları @InjectMocks kullanılmadan enjekte etmeyi gösterebilir misiniz? Testimin nasıl kurulduğunu göstermek için Q'mı güncelledim. – tamuren

cevap

0

, Alacağınız nesne bağımlılıkları ziyade yapıcı yoluyla belirtilmişse sadece aynı şeyi yapabilirsiniz

import org.junit.Before; 
import org.junit.Test; 

import static org.mockito.Mockito.*; 

public class MyTest { 

    private MyClass myClass; 
    private MyDependency myDependency; 

    @Before 
    public void setUp(){ 
     myClass = new MyClass(); 
     myDependency = mock(MyDependency.class); 
     myClass.setMyDependency(myDependency); 
    } 

    @Test 
    public void test(){ 
     // Given 

     // When 

     // Then 
    } 
} 

public class MyClass { 
    private MyDependency myDependency; 

    public void setMyDependency(MyDependency myDependency){ 
     this.myDependency = myDependency; 
    } 
} 

ve

gibi bir şey setterden daha. Bağımlılık enjeksiyon çerçeveniz, belirleyicilere özel alanları eklediğiniz gibi ek açıklama ekleyebilir, ancak şimdi testleriniz herhangi bir bağımlılık enjeksiyon çerçevesine dayanmamaktadır.

+0

Bağımlılık enjeksiyon çerçevesini kullanarak karşı koyamıyorum. Ellerimde olmayan bir tasarım kararı. – tamuren

9

JUnit kullanarak Mockito 1.9.5 ile aynı türde iki nesneyi alay etmeye çalıştım ve işe yarıyor.

Bkz: http://static.javadoc.io/org.mockito/mockito-core/1.9.5/org/mockito/InjectMocks.html

doktordan İlgili tipi bilgisi:

"Saha enjeksiyon; mocks ilk türüne göre çözülecektir, o zaman, aynı tipte birkaç özellik maç ile, varsa alan adı ve sahte isim. "

Ve sen aynı türden iki tane olduğunda sahte isim tüm mocks için alan adını maç yapmak gerektiğini söylemek gibi görünüyor bu bir:

"1 Not: Aynı tip alanlar varsa (veya aynı silme), tüm @Mock açıklamalı alanlarla eşleşen alanları adlandırmak daha iyidir, aksi halde Mockito kafası karışabilir ve enjeksiyon gerçekleşmeyebilir. "

Belki bu ikinci kişi sizi ısırıyor mu?

1

Splonk'un işaret ettiği şeyi doğruladım ve alay edilmiş sınıflardan birini çıkarır çıkarmaz Mockito 1.9.5'te bu şekilde çalışır, başarısız oldu. Test kodu gibi nasıl

@Mock 
private SomeClass someClassA; 
@Mock 
private SomeClass someClassB;