2011-12-15 4 views
5

'ImporterService'클래스를 테스트하기위한 테스트 클래스를 작성하고 있습니다. 이 서비스는 InputStream을 읽고 데이터에서 Object를 만듭니다. Object (이 경우 Builder 클래스)는 'ImporterService'클래스에서 인스턴스화됩니다. 'ImporterService'클래스를 테스트하려면 Builder 클래스에서 호출을 확인해야한다. 이를 위해 Mocking 프레임 워크를 사용하고 싶지만 'ImporterService'외부에서 'Builder'객체의 모의 인스턴스를 만드는 것이 어떻게 가능합니까? 나는 시험의 설정에 오버라이드 (override) 할 수있는 보호 방법에 빌더 클래스의 생성을 이동에 대해 생각했다내부 인스턴스 개체를 조롱

 


    public Builder importFrom(BufferedReader reader) throws IOException { 
     String someValue = readFrom(reader); 
     Builder builder = new Builder(); // I need to mock this Builder object... 
     builder.someMethod(someValue);  // to see of a method is called with the expected value 
    } 
 

: 같은

내 'ImporterService'클래스의 방법이 보인다. 그러나이 솔루션은 'ImporterService'클래스가 일부 내부 로직을 유출하고 있으며 내가 원하지 않는 다른 클래스에 의해 메소드를 재정의 할 수있게 해 주므로 나에게 좋지 않은 것처럼 보입니다.

답변

2

의존성 삽입 라이브러리 (예 : Spring)를 사용하는 경우 Builder 대신 mock 객체를 ImporterService 클래스에 삽입 할 수 있습니다. 또는 생성자에 대한 호출을 factory로 호출하고 factory를 사용하여 테스트 코드에서 mock을 반환 할 수 있습니다.

+0

: 당신이 다음을 수행 단위 테스트에서

public class Reader{ private BuilderFactory factory = new BuilderFactory(); // Use production factory by default public Builder importFrom(BufferedReader reader) throws IOException { String someValue = readFrom(reader); Builder builder = factory.buildBuilder(); builder.someMethod(someValue); // to see of a method is called with the expected value } } 

: 여기

은 당신이 이것을 달성 할 수있는 방법을 보여주는 EasyMock를 사용하는 예입니다 귀하의 단위 테스트에서 다른 봄 프레임 워크 또는 다른 DI 프레임 워크. 배선을 테스트하지 않는 한 –

0

당신이 (필자는이 조롱 프레임 워크를 recomment) jMockt를 사용하는 가정하면, 다음을 수행 할 수 있습니다 : 예 PowerMock

@Test 
    public void testFoo(@Mocked Builder builder) { 
     new Expectations() { 
      { 
       new Builder(); 
       returns(builder); 

       builder.setSomemethod() 
       ... 
      } 
     }; 

     assertSame(builder,impoertesService.importFrom(...)); 
    } 
0

일부 조롱 프레임 워크의 건설을 조롱 할 수 있습니다.

0

당신은 이런 식으로 함수 서명을 변경할 수 있습니다

public Builder importFrom(BufferedReader reader, Builder builder) throws IOException { 

을 이렇게 당신이 당신의 테스트 케이스에서 어떤 더미 구현을 전달할 수 있습니다. 이것은 의존성 주입의 한 방법입니다.

의존성 주입에 대한 아이디어는 모든 의존성을 묻는 것이며, 클래스/함수가이를 수행하면 코드가 고도로 테스트 가능해진다.

1

예, 당신은 당신이 제안 할 또는 수 있습니다 :

Builder 개체를 만들고 독자 클래스에 할당하는 공장 클래스를 만듭니다. 단위 테스트에서이 팩토리를 모의 테스트하고 단위 테스트에서 메서드 호출을 확인할 수 있도록 선택한 Builder을 만듭니다. 필요하지 않은 당신은 좋은 조롱 프레임 워크를 사용하는 경우

Reader classUnderTest = new Reader(); 
BuilderFactory fakeFactory = EasyMock.createNiceMock(BuilderFactory.class); 
Builder builder = EasyMock.createMock(Builder.class); 
EasyMock.expect(fakeFactory.buildBuilder()).andReturn(builder); 
builder.someMethod("value here"); 
EasyMock.expectLastCall().once(); 
EasyMock.replay(fakeFactory, builder); 
classUnderTest.importFrom(bufferReader); 
// Very that all calls were correctly performed on the builder 
EasyMock.verify(builder); 
관련 문제