2017-01-09 56 views
1

我有代碼的簡單的一行:錯誤,用嘲諷的嵌套調用

DraftCampaignDetails createdDraft = draftCampaignI.createDraftCampaign(ConvertionUtil 
       .getDraftCampaignDetailsfromCreateDraftRequest(request)); 

我想嘲笑它:

ConvertionUtil action1 = PowerMockito.mock(ConvertionUtil.class); 
    when(action1.getDraftCampaignDetailsfromCreateDraftRequest(request)).thenReturn(details); 

    when(draftCampaignI.createDraftCampaign(details)).thenReturn(details); 

但我收到此錯誤:

when() requires an argument which has to be 'a method call on a mock'. 

添加整個測試類以獲得更多清晰度:

public class DraftCampaignActivityTest { 
@Mock 
IDraftCampaign draftCampaignI; 

/* @Mock 
ConvertionUtil util;*/ 

@Before 
@SuppressWarnings("unchecked") 
public void setup() 
    { 
    MockitoAnnotations.initMocks(this); 
    } 

@Test 

public void createDraft_newDraft() { 
    DraftCampaignActivity draftContoller = new DraftCampaignActivity(); 

    CreateDraftCampaignRequest request = createRequest(); 
    DraftCampaignDetails details = buildDraftDetails(); 
    if(draftCampaignI != null){ 
     System.out.println("sccdscscd"); 
    } 
    /* 
    if(util != null) { 
     System.out.println("wewewew"); 
    }*/ 
    /// ConvertionUtil action1 = PowerMockito.mock(ConvertionUtil.class); 
    PowerMockito.mockStatic(ConvertionUtil.class); 
    PowerMockito.when(
       ConvertionUtil.getDraftCampaignDetailsfromCreateDraftRequest(request) 
      ).thenReturn(details); 

    when(draftCampaignI.createDraftCampaign(details)).thenReturn(details); 
    // when(util.getDraftCampaignDetailsfromCreateDraftRequest(request)).thenReturn(details); 




    CreateDraftCampaignResponse response = new CreateDraftCampaignResponse(); 
    draftContoller.createDraftCampaign(request); 
    response.setDraftCampaignId(details.getDraftId()); 
    Assert.assertEquals(response.getDraftCampaignId(),"ww"); 



} 

private DraftCampaignDetails buildDraftDetails() { 
    DraftCampaignDetails details = new DraftCampaignDetails(); 
    details.setDraftId("ww"); 
    return details; 
} 

private CreateDraftCampaignRequest createRequest() { 
    CreateDraftCampaignRequest request = new CreateDraftCampaignRequest(); 
    request.setCampaignInfo("campaignInfo"); 
    request.setMarketplaceId("adadedaedaed"); 

    DraftCampaignDetailsBase base = new DraftCampaignDetailsBase(); 
    Money money = new Money(); 
    money.setCurrencyCode("USD"); 
    money.setMillicents(10L); 
    base.setCampaignBudget(money); 
    base.setCampaignName("name"); 
    base.setDraftCampaignState("DRAFT"); 
    request.setDraftCampaignDetailsBase(base); 
    return request; 

    //request 
} 

我是Mockito和Powermock的新手。請幫忙!任何幫助將不勝感激!

+0

'draftCampaignI'被嘲笑了嗎? – dreamer

+0

您不想'when(draftCampaingnI.createDraftCampaign ......'返回'action1'而不是'details'? – dreamer

+0

否@malka。createDraftCampaign接受ConvertionUtil形成的細節對象並返回細節對象。更多細節可以在這裏看到http://stackoverflow.com/questions/41554497/mocking-nested-function-is-giving-npe請幫忙! – user3681970

回答

1

若要draftCampaignI必須注入draftContoller,這樣做你需要聲明draftContoller@InjectMocks註解測試類的領域,沒有必要明確了創建DraftCampaignActivity的情況下,離開它的Mockito,如下:

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import static org.mockito.Mockito.when; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
public class DraftCampaignActivityTest { 

    @Mock 
    IDraftCampaign draftCampaignI; 

    @InjectMocks 
    DraftCampaignActivity draftContoller; 

    @Test 
    @PrepareForTest(ConvertionUtil.class) 
    public void createDraft_newDraft() { 
     CreateDraftCampaignRequest request = new CreateDraftCampaignRequest(); 
     DraftCampaignDetails details = new DraftCampaignDetails(); 

     PowerMockito.mockStatic(ConvertionUtil.class); 
     PowerMockito.when(
      ConvertionUtil.getDraftCampaignDetailsfromCreateDraftRequest(request) 
     ).thenReturn(details); 

     when(draftCampaignI.createDraftCampaign(details)).thenReturn(details); 

     draftContoller.createDraftCampaign(request); 
    } 
} 

假設類DraftCampaignActivity的類型爲:

public class DraftCampaignActivity { 
    ... 
    private IDraftCampaign draftCampaignI; 
    ... 
} 

更多關於註釋的細節InjectMocks

注:由於我們使用@RunWith(PowerMockRunner.class),我們沒有必要要求MockitoAnnotations.initMocks(this)明確,因爲它會在內部完成,使得本方法setup是無用的,可以被刪除。

+0

我添加了整個單元測試課程,請看看,draftCampaignI是一個模擬代碼 – user3681970

+0

感謝Nicolas,讓我檢查一下 – user3681970

+0

謝謝Nicolas。但它似乎有同樣的問題。 Line「PowerMockito.when( ConvertionUtil.getDraftCampaignDetailsfromCreateDraftRequest(request) ).thenReturn(details);」 – user3681970