2017-05-11 10 views
1

테스트와 관련하여 도움이 필요합니다. 다음과 같은 방법을 갖는 것은 :void 메서드 내에서 정적 메서드가 한 번 호출되었다는 것을 테스트했습니다.

@PrePersist 
    public void prePersist(Tag tag) { 

     if (tagService.listUserTags(tag.getUser()) 
       .size() > Constants.Tags.maxPerUser) { 
      TaskUtils.createTask(url, param); 
     } 
    } 

나는 TaskUtils.createTask()를 한 번만 호출하는지 테스트하기를 원하지만 그것이 실행되는 내부 나는 코드를 원하지 않는다. 나는이 같은 시도 :

 @Test 
     @PrepareForTest(TaskUtils.class) 
     public void testPrePersistMethodWhenTagCountOverLimit() { 
      [...] 
      when(tags.size()).thenReturn(Constants.Tags.maxPerUser + 1); 
      when (tagService.listUserTags(tag.getUser())).thenReturn(tags); 

      PowerMockito.mockStatic(TaskUtils.class); 
      PowerMockito.doNothing().when(TaskUtils.class, "createTask", Mockito.any(String.class), Mockito.any(String.class));            

      Method method = ClassUtils.getMethodWithAnnotation(TagListener.class, PrePersist.class); 
      method.invoke(tagListener, tag); //here the prePersist method is called 

      PowerMockito.verifyStatic(Mockito.times(1)); 

     } 

그러나 방법 TaskUtils.createTask()는 실제로 doNothing에도 불구하고 실행됩니다. 스택 추적 부분 :

java.lang.NullPointerException 
    at fi.util.TaskUtils.createTask(TaskUtils.java:90) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1873) 
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:773) 
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:753) 
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466) 
    at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106) 
    at fi.intra.test.domain.listener.TestTagListener.testPrePersistMethodWhenTagCountOverLimit(TestTagListener.java:92) 

아이디어가 있으십니까?

+0

은 url 및 param 인수 모두의 유형입니까? – pvpkiran

+0

@pvpkiran, yes 그것은 –

+0

입니다.이'@RunWith (PowerMockRunner.class)'가 있다고 가정합니다. 코드 나머지 부분은 괜찮아 보인다 – pvpkiran

답변

0

다음 작품 귀하의 경우에 해당되어야한다 :

나는 건물에 대한 Gradle을 사용하고 다음 종속성 추가 :

testCompile group: 'org.powermock', name: 'powermock-mockito-release-full', version: '1.6.4'

테스트

package sojava.mocking; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import static org.assertj.core.api.Assertions.assertThat; 
import static org.mockito.Mockito.times; 
import static org.powermock.api.mockito.PowerMockito.*; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyData.class) 
public class PowerMockitoTests { 

    @Test 
    public void static_method_when_mocked_does_nothing() throws Exception { 
     int amount = 123; 

     // Arrange 
     mockStatic(MyData.class); 
     doNothing().when(MyData.class, "increment", amount); 

     // Action 
     new MyDataWrapper().increment(amount); 
     verifyStatic(times(1)); 
     MyData.increment(amount); 

     // Assert 
     assertThat(MyData.getCount()).isEqualTo(0); 
    } 
} 

이 코드를 보았습니까?

new MyDataWrapper().increment(amount); 
verifyStatic(times(1)); 
MyData.increment(amount); 

이것은 어색하지만 작동 방식입니다. 정적 메서드가 여러 번 호출되었다는 것을 테스트하고 싶습니까? 그런 다음 해당 메서드를 호출 한 다음 verifyStatic()을 호출 한 다음 해당 정적 메서드를 다시 호출합니다. 마지막 호출이 확인을 트리거합니다. 정적 메소드

를 사용

클래스

package sojava.mocking; public class MyDataWrapper { public void increment(int amount) { MyData.increment(amount); } } 

정적 메소드를

sojava.mocking 패키지를 포함하는 클래스;

public class MyData { 

    private static int count = 0; 

    private MyData() { 
    } 

    public static void increment(int amount) { 
     count += amount; 
    } 

    public static int getCount() { 
     return count; 
    } 
} 

더 많은 샘플 : 더 많은 샘플들이 Github page on the tests folder에 있습니다.

+0

고마워요! 그것은 작동한다. –