模拟嵌套函数给NPE [英] mocking nested function is giving NPE

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

问题描述

我在尝试编写单元测试用例
时遇到空指针异常这是类的详细信息:

Hi I am getting Null Pointer Exception while trying to write unit test cases Here is the class detail:

public CreateDraftCampaignResponse createDraftCampaign(CreateDraftCampaignRequest request) throws InvalidInputsException,
        DependencyException, UnauthorizedException {
    CreateDraftCampaignResponse draftCampaignResponse = null;

    try {
        DraftCampaignDetails createdDraft = draftCampaignI.createDraftCampaign(ConvertionUtil
                .getDraftCampaignDetailsfromCreateDraftRequest(request));
        draftCampaignResponse = new CreateDraftCampaignResponse();
        draftCampaignResponse.setDraftCampaignId(createdDraft.getDraftId());       
    }
    catch (Exception e) {
        log.error("Create Draft Campaign Exception", e);
        throw e;
    }
    return draftCampaignResponse;
}

这是ConvertionUtil类:

This is the ConvertionUtil class:

 public static DraftCampaignDetails getDraftCampaignDetailsfromCreateDraftRequest(CreateDraftCampaignRequest request) {

    DraftCampaignDetails draftCampaign = new DraftCampaignDetails();

    DraftCampaignDetailsBase draftCampaignDetailsBase = request
            .getDraftCampaignDetailsBase(); (This is giving exception)
    draftCampaign.setCampaignBudget(draftCampaignDetailsBase
            .getCampaignBudget());
    draftCampaign.setCampaignName(draftCampaignDetailsBase
            .getCampaignName());
    draftCampaign.setDraftCampaignState(draftCampaignDetailsBase
            .getDraftCampaignState());

    draftCampaign.setCreatedUser(request.getUser());

    draftCampaign.setObfuscatedEntityId(request.getObfuscatedEntityId());
    draftCampaign.setCampaignInfo(request.getCampaignInfo());

    return draftCampaign;
}

这就是我尝试过的:

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

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




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



 }

我正在获得NPE 。我是Mockito和其他框架的新手。

I am getting NPE. I am a novice in Mockito and other framework. Please help!

推荐答案

它不起作用,因为您尝试模拟静态方法,您做得不好,以至于它调用导致您遇到这种情况的NPE的真实方法。

It doesn't work because you try to mock a static method and you don't do it properly such that it calls the real method which leads to this NPE in your case.

要使用 Powermock 模拟静态方法,您需要:

To mock a static method using Powermock, you need to:


  1. 使用 @RunWith(PowerMockRunner.class)批注测试用例的类级别。

  2. 在测试的类级别使用 @PrepareForTest(ClassThatContainsStaticMethod.class)批注

  3. 使用 PowerMock.mockStatic(ClassThatContainsStaticMethod.class)模拟该类的所有方法。

  1. Use the @RunWith(PowerMockRunner.class) annotation at the class-level of the test case.
  2. Use the @PrepareForTest(ClassThatContainsStaticMethod.class) annotation at the class-level of the test case.
  3. Use PowerMock.mockStatic(ClassThatContainsStaticMethod.class) to mock all methods of this class.

因此,您的情况应该是:

So in your case, you should have something like:

@RunWith(PowerMockRunner.class)
public class MyTestClass {
    @Test
    @PrepareForTest(ConvertionUtil.class)
    public void createDraft_newDraft() {
        ...
        PowerMockito.mockStatic(ConvertionUtil.class);
        PowerMockito.when(
            ConvertionUtil.getDraftCampaignDetailsfromCreateDraftRequest(request)
        ).thenReturn(details);
        ...
    }

有关如何使用Powermock模拟静态方法

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

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