我正在使用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
答案 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);
}