在Java中,如何使用断言测试Junit Mockito中的void方法?
如何使用assertSame或assertEquals测试Mockito中的void方法。我只能做验证。 我发现sonar或PMD规则违规-“JUnit测试应该包括assert()或fail()。 下面是我的示例类和测试类在Java中,如何使用断言测试Junit Mockito中的void方法?,java,mockito,powermockito,Java,Mockito,Powermockito,如何使用assertSame或assertEquals测试Mockito中的void方法。我只能做验证。 我发现sonar或PMD规则违规-“JUnit测试应该包括assert()或fail()。 下面是我的示例类和测试类 @Service public class MyServiceImpl implements IService { @Autowired private IDyDBDAO dyDBDAO; @Override
@Service
public class MyServiceImpl implements IService {
@Autowired
private IDyDBDAO dyDBDAO;
@Override
public void update() {
dyDBDAO.save(getDetailData());
}
@Override
public List<Detail> getCurrentDetail() {
return getDetails(dyDBDAO.findAll());
}
private List<Detail> getDetails(Iterable<Detail> details) {
...blah...
}
private String getPlace(){
Places p = Places.getPlace();//static
return p == null? PlacesUtil.getName("DH"): p.getName;
}
private Detail getDetailData() {
Detail d = new Detail();
d.setName("blah");
d.setDesc("fsdfsdfdsf");
d.setPlace(getPlace());
return d;
}
}
@服务
公共类MyServiceImpl实现IService{
@自动连线
私有的IDyDBDAO-dyDBDAO;
@凌驾
公共无效更新(){
save(getDetailData());
}
@凌驾
公共列表getCurrentDetail(){
返回getDetails(dyDBDAO.findAll());
}
私有列表getDetails(可编辑的详细信息){
……诸如此类。。。
}
私有字符串getPlace(){
Places p=Places.getPlace();//静态
返回p==null?PlacesUtil.getName(“DH”):p.getName;
}
私有详细信息getDetailData(){
详图d=新详图();
d、 setName(“废话”);
d、 setDesc(“fsdfdsf”);
d、 setPlace(getPlace());
返回d;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({Places.class,PlacesUtil.class})
公共类MyServiceImplTest{
@注射模拟
私有MyServiceImpl MyServiceImpl;
@嘲弄
私有的IDyDBDAO-dyDBDAO;
@试验
public void testGetCurrentDetail(){
给定(dyDBDAO.findAll()).willReturn(getMockDetails());
assertSame(myServiceImpl.getCurrentDetail().size(),2);
}
@试验
公共void testUpdate(){
mockStatic(Places.class);
//第一次更新,第二次更新-us-west-2将更新
给定(Places.getPlace()).willReturn(PlacesUtil.getName(“UH”))
.willReturn(空);
myServiceImpl.syncStatus();
//再次向卫生署更新
myServiceImpl.syncStatus();
验证(dyDBDAO,times(2)).save(any(Detail.class));
//如何在此处断言检查
}
私有Iterable getMockDetails(){
详图d1=新详图();
d1.设定名称(“废话”);
d1.setDesc(“FSDFDSF”);
d1.设置地点(“sdfsdf”);
详图d2=新详图();
d2.设置名称(“blahblah1”);
d2.setDesc(“e345345”);
d2.设置地点(“8907j”);
List listOfDetail=new ArrayList();
添加详细信息列表(eps1);
添加详细信息列表(eps2);
返回详细信息列表;
}
}
我假设需要测试的void
方法是MyServiceImpl
中的update
首先,您可以验证是否调用了dyDBDAO.save()
Mockito.verify(dyDBDAO).save(Mockito.anyList...);
其次,您可以通过检索数据库中修改或创建的记录,并将其与
getMockDetails
中的输入进行比较,从而检查数据库中的记录。您需要捕获传递给dao save方法的值。使用mockito的ArgumentCaptor。然后断言该值。
大致如下:
ArgumentCaptor<Detail> captor = ArgumentCaptor.forClass(Detail.class);
verify(dyDBDAO, times(2)).save(captor.capture());
Detail detail1 = captor.getValues().get(0)
assertEquals(expectedDetail, detail1)
ArgumentCaptor captor=ArgumentCaptor.forClass(Detail.class);
验证(dyDBDAO,times(2)).save(captor.capture());
Detail detail1=captor.getValues().get(0)
资产质量(预计详情,详情1)
此处的无效方法是什么?请出示一张你不能的照片。然后,update
方法似乎没有任何重要的逻辑可供测试。执行任何有意义的操作的void
方法必须通过副作用(在输入参数上,持久状态)工作。您需要断言副作用。如何在此处给出预期的详细信息。ExpectedDetailOBJ将如何创建?只需实例化它,并将其属性设置为测试所期望的任何属性。详细信息expectedDetail=新的详细信息();非常感谢。但是,如果我使用新实例创建,它在AsserteQual中会如何相同这就是测试的全部要点,您断言在测试中创建的预期值和被测试类创建(然后捕获)的实际值是相同的
ArgumentCaptor<Detail> captor = ArgumentCaptor.forClass(Detail.class);
verify(dyDBDAO, times(2)).save(captor.capture());
Detail detail1 = captor.getValues().get(0)
assertEquals(expectedDetail, detail1)