В Java, Как проверить метод void в Junit Mockito с утверждением? - PullRequest
0 голосов
/ 09 марта 2020

Как протестировать пустые методы в Mockito с помощью assertSame или assertEquals. Я могу только проверить. я получаю нарушение правил сонара или 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;
        }
    }

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({Places.class, PlacesUtil.class})
    public class MyServiceImplTest {

        @InjectMocks
        private MyServiceImpl myServiceImpl;

        @Mock
        private IDyDBDAO dyDBDAO;

        @Test
        public void testGetCurrentDetail() {
            given(dyDBDAO.findAll()).willReturn(getMockDetails());
            assertSame(myServiceImpl.getCurrentDetail().size(), 2);
        }

        @Test
        public void testUpdate() {
            PowerMockito.mockStatic(Places.class);
            // first update  , second update -us-west-2 will update
            given(Places.getPlace()).willReturn(PlacesUtil.getName("UH"))
                    .willReturn(null);       
            myServiceImpl.syncStatus();
            // update again with DH
            myServiceImpl.syncStatus();
            verify(dyDBDAO, times(2)).save(any(Detail.class));
        // how to assert checking here
        }

        private Iterable<Detail> getMockDetails() {
            Detail d1 = new Detail();
            d1.setName("blah");
        d1.setDesc("fsdfsdfdsf");
        d1.setPlace("sdfsdf");

            Detail d2 = new Detail();
            d2.setName("blahblah1");
        d2.setDesc("e345345");
        d2.setPlace("8907j");

            List<Detail> listOfDetail = new ArrayList<>();
            listOfDetail.add(eps1);
            listOfDetail.add(eps2);
            return listOfDetail;
        }

    }

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вам нужно захватить значение, переданное в метод даос сохранения. Для этого используйте ArgumentCaptor от mockito. Тогда утверждай на это значение. Что-то вроде этого:

ArgumentCaptor<Detail> captor = ArgumentCaptor.forClass(Detail.class);
verify(dyDBDAO, times(2)).save(captor.capture());
Detail detail1 = captor.getValues().get(0)
assertEquals(expectedDetail, detail1)
0 голосов
/ 09 марта 2020

Я бы предположил, что ваш void метод, который нужно протестировать, равен update в MyServiceImpl.

Во-первых, вы можете проверить, вызван ли dyDBDAO.save().

Mockito.verify(dyDBDAO).save(Mockito.anyList...);

Во-вторых, вы можете проверить измененные или созданные записи в базе данных, получив их и сравнив с входными данными getMockDetails.

...