2017-02-15 3 views
3

오늘 나는 많은 whenNew 조롱과 관련된 꽤 큰 테스트 케이스를 디버깅하고있었습니다.@PrepareForTest, @RunWith 및 lambda expressions

결국 PowerMock과 함께 @PrepareForTest@RunWith 주석을 사용하면 테스트중인 클래스에서 람다식이 실행되지 않는 것처럼 보입니다.

public class Solution { 
    private int[] arr; 

    void fillArray() { 
     IntStream.range(0, arr.length).forEach(i -> arr[i] = i); 
    } 
} 

그리고 테스트 클래스 : 여기

문제를 보여주는 샘플입니다라는 결코 극복 fillArray 방법 내부 앞의 예 람다 식에

@PrepareForTest(Solution.class) 
@RunWith(PowerMockRunner.class) 
public class SolutionTest { 
    @Test 
    public void test() { 
     int[] arr = new int[5]; 
     Solution solutionMock = mock(Solution.class); 
     Whitebox.setInternalState(solutionMock, "arr", arr); 
     doCallRealMethod().when(solutionMock).fillArray(); 

     solutionMock.fillArray(); 

     for (int i = 0; i < 5; i++) { 
      assertEquals(i, arr[i]); 
     } 
} 

과 테스트가 실패합니다. SolutionTest에서 특수 효과 (또는 두 가지 모두) 중 하나를 제거하면 테스트가 통과되지만 실제로는 해결책이 아니므로 whenNew 조롱을하고 싶습니다.

그래서, 궁극적으로 내 질문은 :

모든 솔루션이 있습니까 또는 적어도 실행 가능한 해결 방법 또는 위에서 언급 한 문제를 해결?

+0

사이드 노트와 마찬가지로 : * 화이트 박스 *는 "내부"클래스입니다. Mockito의 최신 버전으로 업데이트 할 때 (클래스가 이미 존재하기 때문에)주의 할 것입니다. 그러나 아아, 당신은 최근의 더 재미있는 버전의 Mockito로 업데이트하지 않을 것입니다. 왜냐하면 PowerMock은 Mockito의 최신 버전과 호환되지 않기 때문입니다. 완전히 벗어난 주제 : 그러나 그러한 문제에서 벗어나고 싶다면 : PowerMock을 제거하십시오. 제 3 자 코드를 테스트하기 위해이 코드를 사용하지 않는 한, 코드를 사용하는 이유가 없습니다 **. * PowerMock이 필요로하는 모든 것이 * 당신이 깨진 디자인을 고칠 때 테스트 할 수 있습니다 ;-) – GhostCat

+0

'모의'대신 '스파이'를 사용해 보았습니까? –

+1

한 가지 더 질문 : PowerMock 버전을 사용하고 있습니까? 모키토? –

답변

0

이 테스트는 PowerMock 1.6.6 및 Mockito 1.10.19를 통과합니다. 버전이 업그레이드되었는지 확인하십시오.