2014-12-19 2 views
5

JUnit 테스트 스위트에서 객체를 조롱하는 데 관심이 있습니다. 그러나 모의 객체를 주입하기 위해 의존성 주입을 사용하는 조롱 프레임 워크를 발견했을뿐입니다. 그러나 파이썬에서 @patch() 라인을 따라 mock 객체를 삽입 할 필요없이 클래스/함수를 모의하고 싶습니다.의존성 주입 기능이없는 Java Mock 객체

사소한 예 :

간단히
//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

라이브러리를 사용하십시오. 모키토. 또는 더 간단한 경우에는'Foo'를 확장하거나 더 나은 방법으로 간단한 인터페이스를 얻기 위해'Foo'와 같은 인터페이스를 구현하십시오. – mike

+0

Mike, Mockito를 보면서, 여전히 의존성이 주입되어야하는 것처럼 보입니다. 선명도를 높이려면 위의 편집을 참조하십시오. –

답변

3

당신은 new가 호출 될 때 모의를 반환하는 테스트중인 장비에 클래스를 Powermock를 사용할 수 있습니다.

Powermock mock constructor tutorial

당신의 코드는 다음과 같습니다

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

당신이 생각이

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

문제처럼 푸 조롱 수 넣어 당신이 정의하지 않은 것처럼 foo.foo()은 본질적으로 아무것도 할 것입니다 무엇 #foo() 조롱 한 버전을 부를 때 돌아와야합니다. 이 같은 일을 할 수있는보다 완벽한 예제를 사용 :

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

제안을 주셔서 감사합니다. 명확한 지원을 위해 내 게시물을 수정했습니다. 이 답변은 내가 묻는 질문과 다른 질문에 답하는 것 같습니다. 죄송합니다. –