0

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

0 Answers0