2017-01-09 9 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

Вы не хотите 'когда (draftCampaingnI.createDraftCampaign ......' возвращать 'action1' вместо' details'? – dreamer

+0

No @malka. CreateDraftCampaign принимает объект детали, образованный с ConvertionUtil, и возвращает объект details. Подробнее см. Здесь 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.

NB: Как мы используем @RunWith(PowerMockRunner.class), у нас нет никакой необходимости вызывать MockitoAnnotations.initMocks(this) явно, как это будет сделано внутри, так что метод setup бесполезно и может быть удалена.

+0

Я добавил весь тестовый класс. Пожалуйста, посмотрите. DraftCampaignI - это макет. – user3681970

+0

Спасибо, Николас. Позвольте мне проверить – user3681970

+0

Спасибо, Николас. Но, похоже, такая же проблема. Такое же исключение происходит на линии «PowerMockito.when ( ConvertionUtil.getDraftCampaignDetailsfromCreateDraftRequest (запрос) ) .thenReturn (подробности);" – user3681970

Смежные вопросы