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
조롱을하고 싶습니다.
그래서, 궁극적으로 내 질문은 :
모든 솔루션이 있습니까 또는 적어도 실행 가능한 해결 방법 또는 위에서 언급 한 문제를 해결?
사이드 노트와 마찬가지로 : * 화이트 박스 *는 "내부"클래스입니다. Mockito의 최신 버전으로 업데이트 할 때 (클래스가 이미 존재하기 때문에)주의 할 것입니다. 그러나 아아, 당신은 최근의 더 재미있는 버전의 Mockito로 업데이트하지 않을 것입니다. 왜냐하면 PowerMock은 Mockito의 최신 버전과 호환되지 않기 때문입니다. 완전히 벗어난 주제 : 그러나 그러한 문제에서 벗어나고 싶다면 : PowerMock을 제거하십시오. 제 3 자 코드를 테스트하기 위해이 코드를 사용하지 않는 한, 코드를 사용하는 이유가 없습니다 **. * PowerMock이 필요로하는 모든 것이 * 당신이 깨진 디자인을 고칠 때 테스트 할 수 있습니다 ;-) – GhostCat
'모의'대신 '스파이'를 사용해 보았습니까? –
한 가지 더 질문 : PowerMock 버전을 사용하고 있습니까? 모키토? –