模拟嵌套调用时出错 [英] error in mocking nested calls

查看:112
本文介绍了模拟嵌套调用时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一行简单的代码:

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

解决方案

要正常工作,必须将draftCampaignI注入draftContoller,为此,您需要将draftContoller声明为测试类的字段,并用<注释c3>,不再需要显式创建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是无用的并且可以删除. /p>

I have a simple line of Code:

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

I am trying to mock it like this:

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

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

But I am getting this error:

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

Adding entire test class for more clarity:

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
 }

I am new to Mockito and Powermock. please help! Any help will be greatly appreciated!

解决方案

To work draftCampaignI must be injected into draftContoller, to do so you need to declare draftContoller as a field of your test class annotated with @InjectMocks, no need to create the instance of DraftCampaignActivity explicitly anymore, leave it to Mockito, as next:

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);
    }
}

Assuming that the class DraftCampaignActivity is of type:

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

More details about the annotation InjectMocks.

NB: As we use @RunWith(PowerMockRunner.class), we have no need to call MockitoAnnotations.initMocks(this) explicitly as it will be done internally such that the method setup is useless and can be removed.

这篇关于模拟嵌套调用时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆