2017-02-17 4 views
0

EasyMock을 사용하여 클래스 단위 테스트를 시도하고 있습니다. 단순화하기 위해 아래 예를 만들었습니다. 내가 원하는 것은 StringBuilder 인스턴스를 테스트하는 동안 EasyMock 인스턴스로 대체하는 것입니다. (StringBuilder의 기능이 아니기 때문에 테스트하고 싶습니다.) 불행히도 아래 예제에서는 작동하지 않습니다. 다른 테스트에서는 EasyMock 인스턴스로 인스턴스 변수를 설정하여 문제를 해결할 수 있습니다.하지만이 예제에서는 로컬 인스턴스화 된 객체이기 때문에이 작업을 수행 할 수 없습니다.인스턴스를 Easymock으로 바꾸려면 어떻게합니까?

누가 나를 도울 수 있습니까?

클래스는 테스트 할 :

package example.easymock 

public class Example { 

    public String exampleMethod() { 
     StringBuilder string = new StringBuilder(); 
     string.append("hello"); 
     return string.toString(); 
    } 
} 

테스팅 클래스 :

package example.easymock 

import needed classes 

public class ExampleTest { 

    @Test 
    public void exampleMethodTest() { 
     StringBuilder stringMock = EasyMock.createMock(); 
     Example example = new Example(); 
     stringMock.append("hello"); 
     EasyMock.expect(stringMock.toString()).andReturn("hi"); 

     EasyMock.replay(stringMock); 

     example.exampleMethod(); 
    } 
} 

답변

2

단지 EasyMock이 불가능 될 것 사용합니다. 더 많은 사실을 변경하지 않습니다 here

, 그 바로이 불가능를 참조하십시오 - 당신은 물론 일에이 제대로 PowerMock 구성을 설정해야

expectNew(StringBuilder.class).andReturn(stringMock); 

: PowerMock는 그러나 할 힘을 포함하지 (부분적으로) Inversion of Control을 디자인 원칙으로 널리 채택하게되었습니다. 또한 일반적으로 테스트 할 수없는 모든 방법은 리팩토링하여 더 나은 (그리고 테스트 할 수있는) 방법 일 수 있습니다. PowerMock은 코드 자체를 개선 할 수없는 경우에만 테스트 용으로 사용해야합니다.

당연히 StringBuilder은 단지 예일뿐 실제로하려는 의도가 아니라고 가정합니다. 언어 라이브러리의 일부인 메소드가 광고 된대로 작동한다고 가정 할 수 있습니다.

+0

PowerMock에서 클래스의 생성자를 실제로 모의 처리 할 수 ​​있습니다. PowerMock에서는 * 가능합니다. – dav1d

+0

@ dav1d 젠장, 그게 강력하다. – Deltharis

+0

TestNG + PowerMock + Mockito를 사용하는 방법을 추가하는 것이 도움이됩니다. 테스트 할 클래스를 준비하십시오 :''@PrepareForTest (SomeService.class)'다음으로 생성자를 그냥 "조롱하십시오 :'whenNew (Date .class) .withNoArguments(). then return (now);' – dav1d

관련 문제