在Java中,如何使用断言测试Junit Mockito中的void方法?

在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

如何使用assertSame或assertEquals测试Mockito中的void方法。我只能做验证。 我发现sonar或PMD规则违规-“JUnit测试应该包括assert()或fail()。 下面是我的示例类和测试类

    @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)