有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java单元测试Mockito MyBatis为返回布尔值的selectone引发空指针异常

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

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());
    }

}

下面是来自daoimpl的方法

@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) 个答案

  1. # 1 楼答案

    在调用DAO方法之前在sqlSession上添加了下面的mock,它工作得很好。此外,我还通过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);
    }