2017-05-11 128 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)); 

     } 

但是,儘管doNothing沒有實際執行方法TaskUtils.createTask()。 堆棧跟蹤的一部分:

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和參數String的類型? – pvpkiran

+0

@pvpkiran,是的,它是 –

+0

我假設你有這個'@RunWith(PowerMockRunner.class)'。其餘的代碼看起來不錯 – pvpkiran

回答

0

下工作,應該等同於你的情況:

我用搖籃的建設,增加了以下依賴性:

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

謝謝!有用 –