i am working on spring boot gradle project
this is my service layer class
create one filter method to fatch list of records
@Transactional
@Service
public class QuestionServiceImpl implements QuestionService {
@Autowired QuestionRepository questionRepository;
@Autowired DomainService domainService;
@Autowired TopicService topicService;
@Override
public Page<Question> fetchByFilter(QuestionFilterRequest questionFilterRequest) {
Pageable paging = PageRequest.of(questionFilterRequest.page(), getSize(questionFilterRequest));
Specification<Question> questionsSpecification = getQuestionSpecification(questionFilterRequest);
return questionRepository.findAll(questionsSpecification, paging);
}
private static int getSize(QuestionFilterRequest questionFilterRequest) {
return questionFilterRequest.size() <= 0 ? 5 : questionFilterRequest.size();
}
private Specification<Question> getQuestionSpecification(QuestionFilterRequest questionFilterRequest) {
return (root, query, cb) -> {
Join<Question, Domain> domainJoin = root.join(Constant.DOMAIN);
Predicate domainPredicate = cb.equal(domainJoin.get(Constant.UUID), questionFilterRequest.domain());
Predicate optionalPredicate = getPredicate(questionFilterRequest, root, cb);
return cb.and(domainPredicate, optionalPredicate);
};
}
private Predicate getPredicate(QuestionFilterRequest questionFilterRequest, Root<Question> root, CriteriaBuilder cb) {
Predicate optionalPredicate = cb.conjunction();
if (StringUtils.hasLength(questionFilterRequest.topic())) {
Join<Question, Topic> topicJoin = root.join(Constant.TOPIC);
optionalPredicate = cb.and(optionalPredicate, cb.equal(topicJoin.get(Constant.UUID), questionFilterRequest.topic()));
}
if (StringUtils.hasLength(questionFilterRequest.search())) {
optionalPredicate = cb.and(optionalPredicate, cb.like(root.get(Constant.QUESTION), Constant.PERCENTAGE + questionFilterRequest.search() + Constant.PERCENTAGE));
}
if (StringUtils.hasLength(questionFilterRequest.complexity())) {
optionalPredicate = cb.and(optionalPredicate, cb.equal(root.get(Constant.COMPLEXITY), questionFilterRequest.complexity()));
}
optionalPredicate = questionFilterRequest.archive() ? cb.and(optionalPredicate, cb.equal(root.get(Constant.ARCHIVE), true)) :
cb.and(optionalPredicate, cb.equal(root.get(Constant.ARCHIVE), false));
return optionalPredicate;
}
}
i am writing junit5 test cases for this service class
Using Junit5 with mockito
This is my JUnit service layer test cases
@ExtendWith(MockitoExtension.class)
@AutoConfigureTestDatabase(replace = Replace.NONE)
class QuestionServiceImplTest {
@InjectMocks
QuestionServiceImpl questionService;
@Mock
DomainService domainService;
@Mock
TopicService topicService;
@Mock
QuestionRepository questionRepository;
private Topic topic;
private Domain domain;
private Question question;
private List<QuestionMcq> questionMcq;
@BeforeEach
void addTestRecord() {
domain = createDomain();
topic = createTopic();
questionMcq = createMcq();
question = createQuestion();
}
private List<QuestionMcq> createMcq() {
List<QuestionMcq> questionMcq = new ArrayList<>();
questionMcq.add(new QuestionMcq(1, "6894c5d5-9c32-45eb-9664-d4bd7f085fa7", "Test1", true));
questionMcq.add(new QuestionMcq(2, "6894c5d5-9c32-45eb-9664-d4bd7f085fa7", "Test2", false));
questionMcq.add(new QuestionMcq(3, "6894c5d5-9c32-45eb-9664-d4bd7f085fa7", "Test3", false));
questionMcq.add(new QuestionMcq(4, "6894c5d5-9c32-45eb-9664-d4bd7f085fa7", "Test4", false));
return questionMcq;
}
private Topic createTopic() {
Topic topic = new Topic();
topic.setId(1);
topic.setName("Java");
topic.setUid("35f66eaa-2fc7-4170-8470-feb83ddbf6b0");
topic.setDomain(domain);
return topic;
}
private Domain createDomain() {
Domain domain = new Domain();
domain.setId(1);
domain.setName("java");
domain.setUid("1234z637-c6c1-4dc3-9755-9f6ad974d70b");
return domain;
}
private Question createQuestion() {
Question question = new Question();
question.setId(1);
question.setUid("828dc55b-0089-4213-91e8-0406a00a53c3");
question.setQuestion("Java");
question.setType(QuestionTypeEnum.MCQ);
question.setMarks(1);
question.setDomain(domain);
question.setTopic(topic);
question.setTheoretical(true);
question.setQuestionMcq(questionMcq);
return question;
}
@Test
void fetchByFilter() {
QuestionFilterRequest filterRequest = new QuestionFilterRequest("question",false,"easy","topic-uuid","domain-uuid",0,5);
Question fisrtQuestion = new Question();
fisrtQuestion.setId(11);
fisrtQuestion.setUid("828dc55b-0089-4213-91e8-0406a00a53c3");
fisrtQuestion.setQuestion("Java");
fisrtQuestion.setType(QuestionTypeEnum.MCQ);
fisrtQuestion.setMarks(12);
fisrtQuestion.setDomain(domain);
fisrtQuestion.setTopic(topic);
fisrtQuestion.setTheoretical(true);
fisrtQuestion.setQuestionMcq(questionMcq);
Question secondQuestion = new Question();
secondQuestion.setId(12);
secondQuestion.setUid("828dc55b-0089-4213-91e8-0406a00a53c3");
secondQuestion.setQuestion("Java");
secondQuestion.setType(QuestionTypeEnum.MCQ);
secondQuestion.setMarks(13);
secondQuestion.setDomain(domain);
secondQuestion.setTopic(topic);
secondQuestion.setTheoretical(true);
secondQuestion.setQuestionMcq(questionMcq);
//Pageable paging = PageRequest.of(filterRequest.page(), questionService.getSize(filterRequest));
Specification<Question> specification = questionService.getQuestionSpecification(filterRequest);
Pageable pageable = PageRequest.of(filterRequest.page(), filterRequest.size());
List<Question> questions = Arrays.asList(fisrtQuestion,secondQuestion);
Page<Question> expectedPage = new PageImpl<>(questions, pageable, questions.size());
when(questionRepository.findAll(specification, pageable)).thenReturn(expectedPage);
// when
Page<Question> actualPage = questionService.fetchByFilter(filterRequest);
// then
assertEquals(expectedPage, actualPage);
Mockito.verify(questionRepository).findAll(specification, pageable);
}
}
when i run this test cases facing this error
Strict stubbing argument mismatch. Please check:
- this invocation of 'findAll' method:
questionRepository.findAll(
com.testiqo.exam.engine.service.impl.QuestionServiceImpl$$Lambda$423/0x0000000800e633c8@43effd89,
Page request [number: 0, size 5, sort: UNSORTED]
);
-> at com.testiqo.exam.engine.service.impl.QuestionServiceImpl.fetchByFilter(QuestionServiceImpl.java:96)
- has following stubbing(s) with different arguments:
1. questionRepository.findAll(
com.testiqo.exam.engine.service.impl.QuestionServiceImpl$$Lambda$423/0x0000000800e633c8@614aeccc,
Page request [number: 0, size 5, sort: UNSORTED]
);
-> at com.testiqo.exam.engine.service.impl.QuestionServiceImplTest.fetchByFilter(QuestionServiceImplTest.java:188)
Typically, stubbing argument mismatch indicates user mistake when writing tests.
Mockito fails early so that you can debug potential problem easily.
However, there are legit scenarios when this exception generates false negative signal:
- stubbing the same method multiple times using 'given().will()' or 'when().then()' API
Please use 'will().given()' or 'doReturn().when()' API for stubbing.
- stubbed method is intentionally invoked with different arguments by code under test
Please use default or 'silent' JUnit Rule (equivalent of Strictness.LENIENT).
For more information see javadoc for PotentialStubbingProblem class.
org.mockito.exceptions.misusing.PotentialStubbingProblem:
Strict stubbing argument mismatch. Please check:
- this invocation of 'findAll' method:
questionRepository.findAll(
com.testiqo.exam.engine.service.impl.QuestionServiceImpl$$Lambda$423/0x0000000800e633c8@43effd89,
Page request [number: 0, size 5, sort: UNSORTED]
);
-> at com.testiqo.exam.engine.service.impl.QuestionServiceImpl.fetchByFilter(QuestionServiceImpl.java:96)
- has following stubbing(s) with different arguments:
1. questionRepository.findAll(
com.testiqo.exam.engine.service.impl.QuestionServiceImpl$$Lambda$423/0x0000000800e633c8@614aeccc,
Page request [number: 0, size 5, sort: UNSORTED]
);
i dont know how solve this