单元测试 - Mockito MyBatis为selectone返回布尔值抛出nullpointer异常

时间:2016-09-15 18:58:24

标签: java unit-testing mybatis

我正在使用InjectMocks进行DAo类并使用@Mock设置依赖项。用于设置方法的@Before@After注释称为MockitoAnnotations.initMocks(this);。这是我的模拟课程:

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 impl的方法

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

}

xml文件中的SQL

<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时遇到空指针异常。我已调试代码和会话可用,不知道为什么我得到空指针。感谢任何帮助。 请注意,getMemberWellnessActivity方法的测试用例工作正常,唯一的区别是selectList而不是selectOne

1 个答案:

答案 0 :(得分:0)

在sqlSession上添加了下面的模拟befor调用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);
}