2016-09-15 736 views
0

我使用InjectMocks进行DAo类并使用@Mock设置依赖项。 @Before@After注释用于设置方法,并且调用MockitoAnnotations.initMocks(this);。这是我班的Mockito:单元测试 - Mockito MyBatis为selectone返回布尔值抛出空指针异常

public class DataDAOTest { 

    @InjectMocks 
    DataDAOImpl DataDAO; 

    @Mock 
    DateUtil dateUtil; 

    @Mock 
    ReferenceDataDAOImpl referenceDataDAOImpl; 

    @Mock 
    SqlSessionTemplate sqlSession; 

    @Mock 
    HashMap<String, Object> params; 

    @BeforeMethod 
    @BeforeClass 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testIsMemberExists_DateOffsetFlag_False_Success() { 
     //Set Up 
     BaseRequest request = new BaseRequest(); 
     request.setMemberId(11111111L); 

     //Expectation 
     when(wellnessProgramsDAO.isMemberExists(request)).thenReturn(true); 

     //SUT 
     boolean response = wellnessProgramsDAO.isMemberExists(request); 

     //Verify 
     Assert.assertEquals(response, true); 
    } 

    @Test 
    public void testGetMemberWellnessActivity_Success() { 
     //Set UP 
     String wellnessPgmCd = "07"; 
     BaseRequest request = new BaseRequest(); 
     request.setMemberId(11111111L); 

     //Expectation 
     when(wellnessProgramsDAO.getMemberWellnessActivity(request, wellnessPgmCd)).thenReturn(mockGetMemberWellnessActivity()); 

     //SUT 
     List<MemberWellnessActivity> mwaList = wellnessProgramsDAO.getMemberWellnessActivity(request, wellnessPgmCd); 

     //Verify 
     assertNotNull(mwaList); 
     Assert.assertEquals(2, mwaList.size()); 
     Assert.assertEquals("Exercise", mwaList.get(0).getWellActDescTxt()); 
     Assert.assertEquals("WeightLoss", mwaList.get(1).getWellActDescTxt()); 
    } 

} 

下面是从DAO实现了一套方法,从XML文件

<select id="isMemberExists" resultType="boolean"> 
    <![CDATA[ 
    SELECT 
     (CASE WHEN (COUNT(MEMBER_ID) > 0) 
      THEN '1' ELSE '0' END 
     ) AS "IS_EXISTS" 
    FROM ${Schema}.MEMBER 
    WHERE MEMBER_ID=#{memberId} 
    ]]> 
</select> 

我得到空指针异常而执行selectone

@Repository 
@Transactional 
public class DataDAOImpl extends SqlSessionDaoSupport implements 
     DataDAO { 
    @Autowired 
    private DateUtil dateUtil; 

    @Autowired 
    private ReferenceDataDAO referenceDataDAO; 

    private static final String CURRENT_DATE = "currentDate"; 
    private static final String CURRENT_YEAR = "currentYear"; 

    @Override 
    public boolean isMemberExists(BaseRequest request) { 
     LOGGER.debug("Calling DOA impl to get isMemberExists"); 
     HashMap<String, Object> params = new HashMap<String, Object>(); 
     params.put("memberId", request.getMemberId()); 
     if(dateUtil.isDateOffsetFlag()) { 
      Date date = referenceDataDAO.getClaimProcessDate(); 
      params.put(CURRENT_DATE, dateUtil.getCurrentSystemDateInDBFormat(date)); 
     } else { 
      params.put(CURRENT_DATE, dateUtil.getCurrentSystemDateInDBFormat()); 
     } 
     boolean isMemberVIP = getSqlSession().selectOne("wellnessPrograms.isMemberExists", params); 
     LOGGER.debug("isMemberExists from DB "+isMemberVIP); 
     return isMemberVIP; 
    } 

    public List<MemberWellnessActivity> getMemberWellnessActivity(
      BaseRequest request, String wellnessPgmCd) { 
     LOGGER.debug("Calling DOA impl to get MemberWellnessActivity "); 
     HashMap<String, Object> params = new HashMap<String, Object>(); 
     params.put("memberId", request.getMemberId()); 
     params.put("wellnessPgmCd", wellnessPgmCd); 
     if(dateUtil.isDateOffsetFlag()) { 
      Date date = referenceDataDAO.getClaimProcessDate(); 
      params.put(CURRENT_YEAR, dateUtil.getCurrentYear(date)); 
     } else { 
      params.put(CURRENT_YEAR, dateUtil.getCurrentYear()); 
     } 
     List<MemberWellnessActivity> memberWellnessActivites = getSqlSession().selectList("wellnessPrograms.getMemberWellnessActivity", params); 
     LOGGER.debug("Member Wellness Activites from DB "+memberWellnessActivites); 
     return memberWellnessActivites; 
    } 

} 

SQL。我有调试代码和会话可用,不知道为什么我得到空指针。感谢任何帮助。 注意测试用例getMemberWellnessActivity方法工作正常,唯一的区别是选择列表的,而不是selectOne

+0

请提供TestCase的完整代码 –

+1

您的意思是'selectOne'方法中有一个NPE吗?或者你的意思是在你称之为的线路上?如果是后者,则表明'getSqlSession()'返回null。无论哪种情况,您都没有真正显示出足够的代码来让任何人能够告诉您为什么。 –

+0

我给出了完整的代码。 在调试时,我检查了getSqlSession()正在返回会话对象。问题出在执行selectOne(“wellnessPrograms.isMemberExists”,params);不知道为什么得到nullpointe。 – Vinay

回答

0

低于模拟加在SQLSESSION再调用DAO方法和它的工作般的魅力。另外,我通过TestNG和Cobertura代码覆盖运行代码,结果是积极的。感谢大家的帮助。

public void testIsMemberExists_DateOffsetFlag_False_Success() { 
    //Set Up 
    BaseRequest request = new BaseRequest(); 
    request.setMemberId(11111111L); 

    //Expectation 
    when(sqlSession.selectOne(sql.capture(), paramsCaptor.capture())).thenReturn(new Boolean(true)); 
    when(wellnessProgramsDAO.isMemberExists(request)).thenReturn(true); 

    //SUT 
    boolean response = wellnessProgramsDAO.isMemberExists(request); 

    //Verify 
    Assert.assertEquals(response, true); 
}