参数匹配器的使用无效!预计有2名匹配者,1名已录制



我正在编写一个测试来验证手推车的创建。因此,它只是一种服务方法,基本上在数据库中创建手推车的数量。我正在使用mockito嘲笑存储库。

所以,我正在做的是嘲笑、保存和获取Repository的所有功能。

以下是我的代码:-

package com.service;
import com.model.Bin;
import com.model.Trolley;
import com.model.dao.NewTrolleyDao;
import com.model.enums.BinType;
import com.model.enums.TrolleyType;
import com.repository.TrolleyRepository;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TrolleyServiceTests {
@MockBean
private TrolleyRepository trolleyRepository;
private TrolleyService trolleyService;
private static final long SH_CODE = 123;
private static final TrolleyType trolleyType = TrolleyType.QS;
private List<Trolley> trolleyList = new ArrayList<>();
@Before
public void setUp() {
Answer<Trolley> answer = new Answer<Trolley>() {
public Trolley answer(InvocationOnMock invocation) {
Trolley trolley = invocation.getArgument(0, Trolley.class);
trolleyList.add(trolley);
System.out.println(trolleyList.size());
return trolley;
}
};
Mockito.when(trolleyRepository.findAllByStoreHouseCode(SH_CODE, any(PageRequest.class))).
thenReturn(getTrolleyList());
Mockito.when(trolleyRepository.save(any(Trolley.class))).
thenAnswer(answer);
trolleyService = new TrolleyService(trolleyRepository);
}
private Page<Trolley> getTrolleyList() {
Page<Trolley> trolleys = new PageImpl<Trolley>(trolleyList);
return  trolleys;
}
private NewTrolleyDao getNewTrolleyDao(int size) {
NewTrolleyDao newTrolleyDao = new NewTrolleyDao();
newTrolleyDao.setStoreHouseCode(SH_CODE);
newTrolleyDao.setType(trolleyType);
newTrolleyDao.setSize(size);
return newTrolleyDao;
}
@Test
public void testCreateTrolleys() {
NewTrolleyDao trolleyDao = getNewTrolleyDao(30);
Page<Trolley> res = trolleyService.createTrolleys(trolleyDao);
assertThat(res.getTotalElements()).isEqualTo(30);
}
}

因此,最初我只是取一个空数组列表,并模拟save方法添加到列表中。因为服务方法调用save方法,该方法获取一个trolley并将其保存到它创建的每个trolley的数据库中,它返回Page Of trolley,该方法调用findAllByStoreHouseCode,该方法获得storehousecode和PageRequest。

错误发生在我使用anyArgumentMatcher的行上。我是测试新手,谁能告诉我哪里错了,或者这种方法错了,我应该用其他方式实现测试。

错误如下:-

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Test set: com.service.TrolleyServiceTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.948 s <<< FAILURE! - in com.service.TrolleyServiceTests
testCreateTrolleys  Time elapsed: 0.037 s  <<< ERROR!
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
-> at com.service.TrolleyServiceTests.setUp(TrolleyServiceTests.java:52)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
at com.service.TrolleyServiceTests.setUp(TrolleyServiceTests.java:52)

尝试将Mockito设置更改为低于

Mockito.when(trolleyRepository.findAllByStoreHouseCode(Mockito.eq(SH_CODE), Mockito.any(PageRequest.class))).thenReturn(getTrolleyList());
Mockito.when(trolleyRepository.save(Mockito.any(Trolley.class))).thenAnswer(answer);

最新更新