2014-07-04 6 views
3

전 세계적으로 클래스 메소드를 모의 할 필요가 있습니다.mockito에서 메소드 호출을 전역으로 조롱하는 방법은 무엇입니까?

내 말은 조롱 된 개체 및 스텁 메서드를 만들 수 없다는 의미입니다. 내 API는이 객체를 인수로 사용하지 않기 때문에 함수 호출 안에서 전달할 수는 없지만이 클래스의 객체는 해당 함수 내부에서 생성되어 사용됩니다. 그래서 전 세계를 조롱해야합니다.

class A { 
    public void methodA() {} 
} 

모의 메소드 A()가 필요합니다.

나는 모키토에 의해 생존하는 것이 거의 불가능할 수도 있습니다. 누구나이 아이디어를 얻는 방법을 알고 있습니까? 아니면 코드를 다시 작성해야합니까?

+0

당신은 분명하지 않습니다. "글로벌"이란 무엇을 의미합니까? 정확히 당신이해야 할 일은 무엇입니까? "mock()"호출로 클래스의 조롱 된 인스턴스를 만들고 해당 조롱 된 인스턴스에서 "when()"의 변형을 가진 메소드의 동작을 제한합니다. 나는이 모든 것을 알고 있다고 가정합니다. 그래서 당신의 문제는 정확히 무엇입니까? 아마도 더 많은 코드를 보여 주어야할까요? –

+1

메소드 내에서 새로운 객체를 생성하지 않도록 코드를 리팩터링해야합니다. 이렇게하는 방법에 대한 몇 가지 아이디어가 있습니다 (https://code.google.com/p/mockito/wiki/MockingObjectCreation). –

+0

리팩터링이 더 좋다면, 예를 들어'공장 '을 소개 할 수 있습니다. 또는 당신이 비싸거나 할 수없는 경우에, powermock로 시도하십시오. – gontard

답변

1

코드를 다시 작성해야합니다.

당신이 쓴 :이 클래스의

목적은 이러한 기능 내부에 생성이 당신이 쓸만한 시스템을하려는 경우 일반적으로 나쁜 생각 무언가가

이다 사용된다. 언급 한 함수는 객체를 직접 생성해서는 안되며 객체의 출처 또는 객체를 제공하는 사람조차 알 필요가 없기를 바랍니다.

더 나은 방법은 이러한 기능을 인터페이스와 함께 사용하는 것입니다. 그런 인터페이스 구현자는 함수에 대한 인수가되거나 해당 함수가 속한 객체에 주입됩니다 (예 : contrcutor를 통해).

해당 사항은 Inversion of controlDependency Injection입니다. 이러한 개념은 모듈 식으로 테스트 할 수있는 시스템을 유지 관리하는 데 중요합니다. 응용 프로그램 개발을위한 많은 프레임 워크는 종속성 삽입을 사용하여 응용 프로그램을 개발하는 데 필요한 도구를 제공합니다.

0

또한 단위 테스트에서 @Before 방법으로 전화를 걸기 만하면됩니다. 하지만 코드를 리팩토링해야 할 수도 있습니다. 팩토리가 현명 해 보일 것입니다. 그리고 여러분은 그 팩토리를 삽입하고 아래의 같은 트릭을 사용하여 전체 테스트 클래스에 스텁시킬 수 있습니다.

@Before public void stub_sessionService_userId() { 
    given(sessionService_mock.userId()).willReturn(73L); 
} 
관련 문제