2016-03-22 22 views
2

Özür Değeri değiştir Bu sınıf örneğinde Sonra</p> <pre><code>class A { String a; } </code></pre> <p>enjekte etmek google Guice kullanarak

class B { 
    @Inject A aInstance; 

    public void checkValue(){ 
      System.out.println(aInstance.a); 
    } 
    } 

Belki AspectJ'yi kullanarak sınıf B enjekte edilir, ama ne olur Sanki bir test benim bu bir örneği alacaktır ve B sınıfını kapsayan testi yürütmeden önce "foo" dizesini "foo" olarak ayarlayacaktır, bu yüzden B sınıfı checkValue'yi çağırdığında bu "print" yazacaktır. "

+0

aynı InstanceOf 'çalışması gerekir A' alırsanız. Bu kadar iyi bilmiyorum ama sanırım CDI gibi bir çeşit kapsamı var, yani muhtemelen bir sınıfın aynı örneğini çoklu enjeksiyon hedeflerine enjekte edebiliyor. – Thomas

+0

Çerçeve alay etmek için bir görev gibi geliyor. Bkz. Mockito: http://mockito.org/ – nukie

cevap

1

Sorunuzdaki test kelimesinden bahsediyorsunuz - jUnit testi için B yazıyorsanız, here gösterildiği gibi bir @Before deyiminde enjeksiyonu gerçekleştirebilirsiniz.

private Injector injector; 

@Before 
public void init() throws Exception { 
    injector = Guice.createInjector(new AbstractModule() { 

     @Override 
     protected void configure() { 
      bind(A.class).to(MockedInstanceOfAWithValueFoo.class); 
     } 
    }); 
} 

Ayrıca biz bir biz Aa tanımlamak için kullanılabilecek bir yapıcı olduğunu varsayarsak

bind(A.class).toInstance(new MockedInstanceOfAWithValueFoo()); 

, alay örneği şöyle görünebilir diyebiliriz:

Yine
public class MockedInstanceOfAWithValueFoo extends A{ 

    public MockedInstanceOfAWithValueFoo() { 
     super("foo"); 
    } 

} 

, alaylı sınıfınızın, B'nin (ve Aa'nın ilgili değeri) daha dinamik olmasını sağlamak için bir kurucu aracılığıyla Aa'nın değerini kabul etmesini sağlayabilirsiniz. Mockito ile

+0

Bu kod derlenmiyor. En azından – paul

+0

oluşturduğum bir alay sınıfı ile Ne bölüm derleme değil? 'MockedInstanceOfAWithValueFoo' sınıfı mevcut değil. Bunu kendin yaratmalısın. A bir arabirim olmadığı için, alay edilen örneğin basitçe A'yı uzatan bir sınıf olacağını ve belki de A.a alanını bir düzenleyici veya kurucudan ayarlayacağını hayal ediyorum. – Hervian

+0

Evet tabiki, kendi mock sınıfımı yaratıyorum. Ama haklıyım, sahte uzantıları uzatmayı unuttum A. Teşekkürler – paul

1

:

import static org.junit.Assert.assertNotNull; 
import static org.mockito.Mockito.when; 

import org.junit.Before; 
import org.junit.Test; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 

public class MyTest { 

    @Mock 
    A mockA; 

    @InjectMocks 
    B mockB; 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
     mockA.a = "Foo"; 
     //when(mockA.getA()).thenReturn("Foo"); //if you use getter 
    } 

    @Test 
    public void myTest() { 
     assertNotNull(mockA); 
     assertNotNull(mockA.a); 
     assertNotNull(mockB); 
     assertNotNull(mockB.ainstance); 
     mockB.checkValue(); 
    } 

} 
+0

olduğu için o kadar kolay olmayacak çünkü ben bir ünite testi değil, bir BBD testi – paul

İlgili konular