2014-12-19 34 views
5

olmadan ancak ben sadece sahte nesneleri enjekte etmek bağımlılık enjeksiyon kullanmak çerçeveler alay rastlamak, bir JUnit test-suite nesneleri alaycı ilgileniyorum. Bununla birlikte, python @patch hatları() boyunca, bu yalancı nesne enjekte etmeden sahte sınıfları/işlevleri mümkün istiyoruz.Java Mock nesne, bağımlılık enjeksiyon

Önemsiz örnek:

Basitçe
//dependency injection 
public String bar(Foo foo) { 
    return foo.foo(); //just pass in mock Foo object 
} 
//.... onto test code 
Foo mockedFoo = <Mocked Foo object>; 
String response = bar(mockedFoo); 
assertEqual(response, <mockedFoo return value>); 


//case I am looking for 
public String bar() { 
    Foo foo = new Foo(); //how to create mock object here? 
    return foo.foo(); //or simply how to mock a single function? 
} 
//... onto test code 
<force the Foo class or foo method to be mocked from here without touching bar() source code> 
String response = bar(); 
assertEqual(response, <mocked response>); 
+0

http://stackoverflow.com/questions/10895605/how-to-mock-a-single-method-in-java – kamoor

+0

Örneğin bir kütüphane kullanın Mockito. Veya daha basit durumlarda, 'Foo'yu genişletin ya da daha da iyisi, basit bir alay alabilmek için 'Foo' ile aynı arayüzü uygulayın. – mike

+0

Mike Mockito bakarak gelen, hala bağımlılıkları enjekte edilmesi gerekir anlaşılmaktadır. Açıklığı arttırmak için lütfen yukarıdaki tabloya bakınız. –

cevap

3

Sen new çağrıldığında bir taklidini dönmek için test edilen araca sınıfını Powermock kullanabilirsiniz.

Powermock mock constructor tutorial

kod aşağıdaki gibi görünecektir:

RunWith(PowerMockRunner.class) 
@PrepareForTest(Bar.class) 
public class BarTest { 


@Test 
public void test(){ 
    Foo mockedFoo = createMock(Foo.class); 
    //set up mockedFoo here 
    ... 

    //This will make a call to new Foo() inside Bar.class 
    //return your mock instead of a real new one 
    expectNew(Foo.class).andReturn(mockedFoo); 

    ... 
    replay(mockedFoo, File.class); 

    Bar bar = new Bar(); 
    String response = bar.bar(); 

    assertEqual(response, <mocked response>); 

    verify(mockedFoo, File.class); 


} 

} 
0

Eğer bu olsa bu

public String bar() { 
    Foo foo = Mockito.mock(Foo.class); 
    return foo.foo(); 
} 

sorun gibi Foo alay olabilir, koymak sen tanımlanmamış gibi foo.foo() esasen hiçbir şey yapmayacak ne olduğunu #foo() alaylı versiyonu çağırdığımızda dönmelidir. Böyle bir şey yapabileceğini daha eksiksiz örneği kullanarak:

class MyTest { 

    Foo mockedFoo = Mockito.mock(Foo.class); 

    @Before 
    public void setUp() throws Exception { 
     Mockito.when(mockedFoo.foo()).thenReturn("This is mocked!"); 
    } 

    @Test 
    public void testMock() { 
     String returnedFoo = mockedFoo.foo(); 
     Assert.assertEquals("This is mocked!", returnedFoo); 
    } 
} 
+0

teşekkürler öneri için, netlik yardımcı olmak için benim yazı güncellenmiştir. Bu yanıtın, sorduğum sorudan biraz farklı bir soruya cevap verdiği anlaşılıyor. –

İlgili konular