模拟嵌套调用时出错

error in mocking nested calls

我有一行简单的代码:

 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'.

添加整个测试 class 以更加清晰:

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 的新手。请帮忙!任何帮助将不胜感激!

要工作 draftCampaignI 必须注入 draftContoller,为此你需要将 draftContoller 声明为你的测试 class 的字段并用 [=15 注释=],无需再显式创建 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);
    }
}

假设 class DraftCampaignActivity 的类型为:

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

有关注释的更多详细信息 InjectMocks

注意: 当我们使用 @RunWith(PowerMockRunner.class) 时,我们不需要显式调用 MockitoAnnotations.initMocks(this) 因为它将在内部完成,这样方法 setup没用,可以去掉。