2014-06-07 3 views
3

두 개 이상의 ArgumentCaptor 매개 변수를 사용할 때 Nullpointer가 나타납니다. 아무도 잘못 될지도 모른다는 생각이 들지는 않습니까?여러 ArgumentCaptor 매개 변수를 사용하는 방법

@RunWith(PowerMockRunner.class) 
@PrepareForTest(FileHelper.class) 
public class MyTest { 

... 

@Before 
public void setUp() throws Exception { 
PowerMockito.mockStatic(FileHelper.class); 
} 


@Test 
public void save() throws Exception { 
ArgumentCaptor<String> argName = ArgumentCaptor.forClass(String.class); 
ArgumentCaptor<List> argList = ArgumentCaptor.forClass(List.class); 
PowerMockito.doNothing().when(FileHelper.class, "saveTextFile", argName.capture(), 
    argList.capture()); 

... 
} 

FileHelper 클래스의 saveTextFile 방법 :

java.lang.NullPointerException이 의 java.lang.Class에서 : 나는이 코드를 실행하면

public static void saveTextFile(String filename, List<String> data) { 
... 
} 

나는이 예외가 .isAssignableFrom (네이티브 메소드) at org.powermock.reflect.internal.WhiteboxImpl.checkIfParameterTypesAreSame (WhiteboxImpl.java:2432) at org.power mock.reflect.internal.WhiteboxImpl.getMethods (WhiteboxImpl.java:1934) at org.powermock.reflect.internal.WhiteboxImpl.getBestMethodCandidate (WhiteboxImpl.java:1025) at org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException (WhiteboxImpl.java:948) 조직에서 org.powermock.reflect.internal.WhiteboxImpl.invokeMethod (WhiteboxImpl.java:859) 에서 org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod (WhiteboxImpl.java:882) 에서 . org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when에서 powermock.reflect.Whitebox.invokeMethod (Whitebox.java:466) (PowerMockitoStubberImpl.java:106)

나는를 호출하는 경우 메서드는 단 하나의 인수, 즉 list 인수가 모두 제대로 작동하는 메서드입니다.

+0

[일반적인 문제] (https://groups.google.com/forum/#!msg/powermock/o5vBVYwccac/Fg3jE8gRhlIJ) 인 것 같습니다. 귀하의 메서드가 오버로드되었는지 여부를 지정하지 않았지만 스택 추적이 동일한 줄 번호까지 동일하기 때문에 [이 다른 질문] (http://stackoverflow.com/q)의 중복으로 표시하고 있습니다./17695356/1426891). 그 대답이 당신을 도울 것을 희망한다! –

+0

정보 주셔서 감사합니다. 나는 그 방법의 이름을 바꾸었다. – user3717572

답변

1

아마도 "확인"을 대신 사용하고 싶다고 생각합니다.

모의에 "아무것도하지"않을 것으로 기대하고 있습니다.

테스트중인 메소드를 호출하는 것이 더 좋지 않겠습니까? 예상되는 결과가 발생했는지 확인하십시오. 내가 "MyClass에"를 테스트하고 싶었 예를 들어,이 두 클래스를 고려

...

HelperClass.java

public class HelperClass { 

    public static void nastyStaticCall(String filename, List<String> data) { 
     System.out.println("REAL METHOD CALLED!!"); 
    } 
} 

MyClass.java

import java.util.Arrays; 

public class MyClass { 

    public void testMethod() { 
     HelperClass.nastyStaticCall("FILENAME", Arrays.asList("Data")); 
    } 
} 

, 나는 이걸 할거야.

import static org.fest.assertions.Assertions.assertThat; 
import static org.powermock.api.mockito.PowerMockito.mockStatic; 
import static org.powermock.api.mockito.PowerMockito.verifyStatic; 

import java.util.List; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.ArgumentCaptor; 
import org.mockito.Captor; 
import org.mockito.MockitoAnnotations; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(HelperClass.class) 
public class MyClassTest { 

    private MyClass classUnderTest; 

    @Captor 
    private ArgumentCaptor<String> fileNameCaptor; 

    @Captor 
    private ArgumentCaptor<List<String>> dataCaptor; 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 
     mockStatic(HelperClass.class); 
     classUnderTest = new MyClass(); 
    } 

    @Test 
    public void shouldMakeNastyStaticCall() { 
     classUnderTest.testMethod(); 

     verifyStatic(); 
     HelperClass.nastyStaticCall(fileNameCaptor.capture(), dataCaptor.capture()); 

     assertThat(fileNameCaptor.getValue()).isEqualTo("FILENAME"); 
     assertThat(dataCaptor.getValue()).containsOnly("Data"); 
    } 
} 

이 모든 테스트 방법은 실제 코드를 호출 한 다음 올바른 인수로 도우미 클래스가 호출되었는지 확인합니다.

실제로 정적 메서드 호출이 테스트 할 나머지 메서드에서 사용되는 값을 반환 할 것으로 예상되는 경우 "when"을 사용해야하지만 "void"를 반환하면 아무것도하지 않아도됩니다.

일반적으로 개인적으로 "when"절에서 인수 캡처 프로그램을 사용하지 않고 "verify"단계에서이를 사용하지 않습니다.

희망이 도움이됩니다.

관련 문제