与Mockito合作

时间:2017-01-26 11:24:40

标签: unit-testing mockito

我正在用Mockito测试一个Spring impl类。

调用返回void的方法。

但是方法(addCruiseMessages)返回NullPointerException,因为它调用了属性文件。

如何成功测试?

Impl class:

@Path(CruisePricingConstants.SAVE_CRUISE_RESTRICTION)
public Integer saveCruiseRestrictionDetails (List<CruisePricingCruiseDetailsVO> cruiseDetailsVOs){
    List<MessageVO> messageVOs = new ArrayList<MessageVO>();


    MessageVO message = null;

   for(CruisePricingCruiseDetailsVO  cruisePricingCruiseDetailsVO : cruiseDetailsVOs)
   {
       int listLength = cruisePricingCruiseDetailsVO.getViewImpactedCruisesDefinintionVOs().size();
       if(listLength > CruisePricingConstants.ONE)
       {
           Set<CruisePricingViewImpactedCruisesDefinintionVO> set = new HashSet<CruisePricingViewImpactedCruisesDefinintionVO>()  ;
           set.addAll(cruisePricingCruiseDetailsVO.getViewImpactedCruisesDefinintionVOs());
           if(set.size()<listLength)
           {
               message = new MessageVO("msg.searchAndListViewImpactedCruisesWidget.duplicateRecordExist", SproutUtil.getMessage("msg.searchAndListViewImpactedCruisesWidget.invalidCombination"), ErrorSeverity.ERROR);
               messageVOs.add(message);
               WebExceptionUtil.addMessagesToResponse(messageVOs);
               return CruisePricingConstants.ONE;
           }
       }
   }

    LOGGER.debug("CruisePricingViewImpactedCruisesServiceImpl :: saveCruiseRestrictionDetails :: Entry");

    Integer rateID = viewImpactedCruisesComponent.saveCruiseRestrictionDetails(cruiseDetailsVOs);
    if(rateID==CruisePricingConstants.ONE){   
        addCruiseMessages();
        }
    LOGGER.debug("CruisePricingViewImpactedCruisesServiceImpl :: saveCruiseRestrictionDetails :: Exit");
    return rateID;

}

测试课。

   @Test
   public void saveCruiseRestrictionDetails(){    
          CruisePricingCruiseDetailsVO cruisePricingCruiseDetailsVO = MockFactory.populateCruiseRequestVO();  

          List<CruisePricingCruiseDetailsVO> cruisePricingCruiseDetailsVOs=new ArrayList<CruisePricingCruiseDetailsVO>();
          CruisePricingViewImpactedCruisesDefinintionVO cruisePricingViewImpactedCruisesDefinintionVO=MockFactory.populateImpactedVO();

          List<CruisePricingViewImpactedCruisesDefinintionVO> cruisePricingViewImpactedCruisesDefinintionVOs=new ArrayList<CruisePricingViewImpactedCruisesDefinintionVO>();
          cruisePricingViewImpactedCruisesDefinintionVOs.add(cruisePricingViewImpactedCruisesDefinintionVO);
          cruisePricingCruiseDetailsVO.setViewImpactedCruisesDefinintionVOs(cruisePricingViewImpactedCruisesDefinintionVOs);
          cruisePricingCruiseDetailsVOs.add(cruisePricingCruiseDetailsVO);

            when(cruisePricingViewImpactedCruisesComponent.saveCruiseRestrictionDetails(cruisePricingCruiseDetailsVOs)).thenReturn(1);

          CruisePricingViewImpactedCruisesServiceImpl cimpl=mock(CruisePricingViewImpactedCruisesServiceImpl.class);

          CruisePricingViewImpactedCruisesServiceImpl cp=new CruisePricingViewImpactedCruisesServiceImpl();
          Mockito.stubVoid(cimpl).toReturn().on().addCruiseMessages();

          cruisePricingViewImpactedCruisesServiceImpl.saveCruiseRestrictionDetails(cruisePricingCruiseDetailsVOs);

         assertEquals(new Integer(1),cruisePricingViewImpactedCruisesServiceImpl.saveCruiseRestrictionDetails(cruisePricingCruiseDetailsVOs));



   }`

1 个答案:

答案 0 :(得分:0)

如果SproutUtil.getMessage是导致问题的方法,那么您必须:

1)提取到getter方法:

public String getMessage(String message) {
    return SproutUtil.getMessage(message);
}

2)更改实现,以便它调用getter而不是显式调用static util:

message = new MessageVO("msg.searchAndListViewImpactedCruisesWidget.duplicateRecordExist"
,getMessage("msg.searchAndListViewImpactedCruisesWidget.invalidCombination"), ErrorSeverity.ERROR);

3)使用Spy注释cruisePricingViewImpactedCruisesComponent(因为我相信你想要实际调用的一些方法):

@Spy
private CruisePricingViewImpactedCruisesComponent cmp;

4)模拟吸气剂

when(cmp.getMessage(Mockito.any(String.class))).thenReturn("anyString");

试试吧。