개발/java

[powermock] mock static method

방푸린 2022. 7. 21. 14:43
반응형

powermock이란? junit4로 테스트코드를 작성 시 static method를 mock할 수 있게 하는 방법

Mockito Mock Static Method using PowerMock
PowerMock provides different modules to extend Mockito framework and run JUnit and TestNG test cases.

Note that PowerMock doesn’t support JUnit 5 yet, so we will create JUnit 4 test cases. We will also learn how to integrate TestNG with Mockito and PowerMock.

Junit5는 지원하지 않나보다.

 

개발 환경: ivy(ant), java6

아래와 같이 관련 lib를 선언해준다.

<dependency org="org.powermock" name="powermock-core" rev="1.6.3"/>
<dependency org="org.powermock" name="powermock-module-junit4" rev="1.6.3"/>
<dependency org="org.powermock" name="powermock-api-mockito" rev="1.6.3"/>
<dependency org="org.powermock" name="powermock-api-easymock" rev="1.6.3"/>
<dependency org="org.javassist" name="javassist" rev="3.19.0-GA" conf="runtime" force="true" transitive="false"/>
<dependency org="org.mockito" name="mockito-core" rev="1.10.19"/>

 

목표: 아래의 static method를 테스트 코드 내에서 mock한다.

public static DataHandler getDataHandler() throws IllegalStateException {
   ...
}
We need to do the following to integrate PowerMock with Mockito and JUnit 4.

1. Annotate test class with @RunWith(PowerMockRunner.class) annotation.
2. Annotate test class with @PrepareForTest and provide classed to be mocked using PowerMock.
3. Use PowerMockito.mockStatic() for mocking class with static methods.
4. Use PowerMockito.verifyStatic() for verifying mocked methods using Mockito.

 

powermockito가 기존의 junit4와 혼용이 가능한지 궁금했는데, junit4코드를 아래와 같이 수정하니 잘 되는 것을 확인할 수 있었다.

@RunWith(PowerMockRunner.class)  //1.
@PrepareForTest(DataHandlerFactory.class) //2.
//@RunWith(MockitoJUnitRunner.class)
public class HuntBOTest {

//기존 junit4 스타일로 선언
    @InjectMocks
    private HuntBO huntBO;
    @Mock
    private HuntDAO huntDAO;

    public String ALPHA_FILE = "data-alpha.xml";

    public void includeForAlpha(){
    //mockStatic 이후에 하면 null이 나오기 때문에 mock하기 전에 stub을 만들어야 한다.
        DataHandler sample = DataHandlerFactory.create(ALPHA_FILE);

        PowerMockito.mockStatic(DataHandlerFactory.class); //3.
        when(DataHandlerFactory.getDataHandler()).thenReturn(sample);
    }

    @Test
    public void getTop1000__subList__alpha(){
        includeForAlpha();
        when(huntDAO.selectHuntTop1000AfterAug()).thenReturn(getList());
        List<HuntRank> hrList = huntBO.getTop1000();
        List<HuntRank> hrListSub = hrList.subList(0, 1);
        assertThat(hrListSub.get(0).getRank(), is(1));
    }
    
}
728x90
반응형