2016-08-15 4 views
3

나는 Mockito를 처음 사용합니다. 내가 DB를 상호 작용을 조롱하여 서비스에 대한 jnuit를 작성하는 것을 시도하고있다 : 나는 (단지 실제 클래스의 대표)Mockito를 사용한 모의 내부 방법

public class TestService{ 

    public Response getTestList(String type){ 
     list = getListbyType(type); 

     return response.entity(list); 
    } 

    private List getListbyType(String type){ 
      ... 
      .. 
      TestDAO testdao = new Testdao(sqlconn); 
      list = testdao.getListfromDB(type) 
      return list; 
    } 
} 

그리고 내 테스트 클래스를 클래스를 다음 한

입니다

public class TestServiceTest{ 

    @InjectMocks 
    private TestService testService = new TestService(); 
    @Test 
    public void getTestListTest(){ 

     List testlist = new List(); 
     tetslist.add("test1"); 

     TestDAO testdaomock = mock(TestDAO); 
     when(testdaomock.getListfromDB("test")).thenreturn(list); 

     list = testService.getTestList(test); 
    } 
} 
같은

그러나이 테스트를 실행할 때 SQL 쿼리는 실제 DB 호출을 호출하고 조롱 된 값이 아닌 db에서 값을 검색합니다. SQL 연결과 기본이 아닌 생성자를 사용해야합니까? 나는 우둔 해.

- UPDATE는

사람들이 제안대로

, 나는 나의 서비스 생성자에 DAO의 인스턴스를 이동하며 스파이를 사용하지만 여전히 내 실제 DB 호출은 모의 호출 대신 호출됩니다.

+0

'private List getListbyType (String type)'이 private이기 때문에'testdaomock.getListfromDB ("test")'는 컴파일해서는 안됩니다. 어떻게 컴파일합니까? – Arkadiy

+0

getListbyType (String type)은 private이지만 testdaomock.getList fromDB ("test")는 DAO 클래스에 있습니다. – user1933888

+0

'@RunWith (MockitoJUnitRunner.class) ' – WildDev

답변

2

귀하의 문제는 다음 문이다 :

TestDAO testdao = new Testdao(sqlconn); 

당신이) (모의에서 가져온 TestDAO의 인스턴스를 위해 new

을 다음과 testdao.getListfromDB(type)에 사용되는 인스턴스가 아닌 성공적으로 모의, 당신을 의존성의 반전을 전체적으로 적용해야합니다. 즉, new은 단순한 공장이나 Spring 설정 파일과 같이 테스트하지 않으려는 클래스에만 표시되어야합니다. 적절한 IOC는 옵션이 아닌 경우

[업데이트]

, 당신은 DAO를 할당하는 방법을 소개하고 spy()을 할 수 있습니다. 이 방법은 패키지 전용이어야합니다. 이 내용은 here입니다.

또 다른 옵션은 인수로 testdao을 가져 와서 해당 생성자의 조건으로 기본 생성자를 표현하는 패키지 전용 생성자를 추가하는 것입니다.

+0

은 의미가 있지만 IOC을 지금 소개 할 수는 없지만 기본 매개 변수가 아니라 parametarized 생성자를 조롱하는 방법이 있습니까? – user1933888

+0

PowerMock을 사용할 수 있지만 별도의 junit 러너를 사용해야합니다. https://github.com/jayway/powermock/wiki/MockitoUsage#how-to-mock-construction-of-new-objects – sandrozbinden

+1

주입 'TestDAO'를'TestService'에'getTestList' 메소드의'TestDAO' 인스턴스에 대한 참조를 넘겨 주면됩니다. 또 다른 방법은'TestService'에'TestDAO' 속성을 추가하는 것입니다. 'TestDAO' 속성을 설정하는'TestService'에 setter를 추가합니다. 그런 다음 테스트에서이 설정기를 사용하여'TestDAO' 모의를 전달할 수 있습니다. – Poger

2

TestService 클래스 (레거시 코드)를 변경할 수없는 경우 새 인스턴스를 PowerMockito (https://github.com/jayway/powermock)로 조롱 할 가능성이 있습니다. 이것은 바이트 코드 조작을 허용하는 junit 러너 (PowerMockRunner)를 사용합니다. 여기

코드에 대한 예제 : 당신은 당신의 dependcies에 powermock-API-mockito 및 powermock 모듈 - junit4를 추가해야합니다

import static org.mockito.Matchers.anyString; 
import static org.mockito.Mockito.when; 
import org.mockito.Mock; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
public class TestServiceTest { 

    @Mock 
    TestDAO testDaoMock; 

    @Test 
    public void test() throws Exception { 
    List<String> testlist = new ArrayList<>(); 
    testlist.add("test1"); 
    when(testDaoMock.getListfromDB(anyString())).thenReturn(testlist); 
    PowerMockito.whenNew(TestDAO.class).withAnyArguments().thenReturn(testDaoMock); 
    TestService testService = new TestService(); 
    Response actualResponse = testService.getTestList("testType"); 
    assertEquals(expectedResponse, actualResponse); 
    } 
} 

.

관련 문제