2017-04-03 6 views
0

JMockit MockUp API를 사용하여 정적 팩토리 메소드를 모방하여 가짜로 반환하는 방법은 무엇입니까?JMockit을 사용하여 정적 팩토리 메소드를 모방하여 가짜로 반환하는 방법은 무엇입니까?

제 질문은 how do i mock the a static method that provides an instance of the class being mocked with JMockit?과 비슷하며 공동 작업자의 팩토리 메소드가 테스트 환경에서 예외를 throw합니다 (그리고 올바르게 적용될 수 있음). 따라서 문제있는 작업을 줄이기 위해 공장을 조롱해야합니다. 팩토리 메소드를 가지는 클래스는 추상적이며 패키지 전용 생성자 만 있습니다.

즉, 다음 공동 작업자의 경우 collaboratorFactory() 메서드를 조롱하여 가짜 공동 작업자를 반환하도록하려면 어떻게해야합니까? (공동 작업자는 내가 통제 할 수없는 이상 타사 코드입니다.) 시험

public abstract class Collaborator { 
    public static Collaborator collaboratorFactory() { 
     //... some operations that throw in test env ... 
     return new CollaboratorImpl(); 
    } 

    Collaborator() { } 

    public int methodToMock() { 
     return 5; 
    } 
} 

내 수업을 수행합니다

public class ClassUnderTest { 
    public int getValue() { 
     return Collaborator.collaboratorFactory().methodToMock(); 
    } 
} 

내가 가짜 공동 작업자로 "할려고 ClassUnderTest"를 테스트 할 것을 말하자면, 반환 일부 알려진 값 "methodToMock()는"나는 같은 내 테스트 클래스를 정의했습니다 : Collaborator.collaboratorFactory은() 내 테스트 환경에서 예외가 발생하는 경우

public class TestClassUnderTest { 

    static class MockCollaborator extends MockUp<Collaborator> { 
     @Mock public int methodToMock() { 
      return 124; 
     } 
    } 

    @Test 
    public void test1() throws Exception { 
     new MockCollaborator(); 
     ClassUnderTest t1 = new ClassUnderTest(); 
     assertEquals(124, t1.getValue()); 
    } 

} 

이 테스트는 실패합니다. 내가 정말로하고 싶은 것은 collaboratorFactory()를 생략하여 가짜 공동 작업자를 반환하는 것입니다. 아마도 다음과 같은 것을 :

static class MockCollaborator extends MockUp<Collaborator> { 
     @Mock public Collaborator collaboratorFactory() { 
      // ... I don't know what to return here ... 
     } 
    } 

collaboratorFactory의 몸에서() 모의 방법 (위), 나는 this.getMockInstance()를 반환하려고했지만, 실제 방법을 조롱하는대로 null을 반환 정적입니다.

FWIW, 필자는 Expectations API를 사용하여 테스트해야하는 항목을 테스트 할 수 있었지만 MockUp API를 사용하여 가능해야한다고 생각합니다.

도움이나 의견을 보내 주시면 감사하겠습니다.

+1

return new Collaborator()를 사용해 보셨습니까? 또는 생성자가 'private'인 경우 Reflection을 통해 인스턴스를 생성합니까? 어쨌든, 올바른 해결책은'@Mocked Collaborator'를 사용하는 것입니다. –

+0

감사합니다. @ Rogério, Collaborator가 실제로 추상 클래스라는 것을 보여주기 위해 질문을 편집 했으므로 새 Collaborator()를 반환하거나 리플렉션을 통해 인스턴스화 할 수 없습니다. 나는이 질문을 썼을 때 나를 도주 한 실제 코드의 미묘함이었다. 나는 답으로 게시 할 해결책을 찾았다. – eakst7

+1

'Collaborator'를'abstract'로 선언하는 것은 의미가 없습니다. 왜냐하면 단지'private' 생성자만을 가지기 때문에 (그리고 어떤 하위 클래스도 막아줍니다) 그리고 (개인 생성자 만 가지고 있기 때문에) 클라이언트 코드가 수업. –

답변

0

공동 작업자는 추상적이기 때문에 두 개의 MockUps (하나는 공동 작업자 용이고 다른 하나는 CollaboratorImpl)로 수행해야했습니다. 추상 클래스의 팩토리 메소드는 getMockedInstance()를 통해 가짜 구현 클래스의 인스턴스를 반환합니다.

static class MockCollaboratorImpl extends MockUp<CollaboratorImpl> { 
    @Mock public void $init() {}; 
    @Mock public void $clinit() {}; 
    @Mock public int methodToMock() { 
     return 124; 
    } 
} 

static class MockCollaborator extends MockUp<Collaborator> { 
    @Mock public Collaborator collaboratorFactory() { 
     return new MockCollaboratorImpl().getMockInstance(); 
    } 
}