Как протестировать класс Java с помощью Спока?

#java #testing #groovy #spock

Вопрос:

Я пытаюсь протестировать класс на Java с помощью Спока. Я в этом очень новичок.

 public class VerifyUser {

    private final ServiceFacade serviceFacade;
    //here is constructor

 @RequestMapping(name = "verifyUser",
            path = "/verifyuser",
            method = RequestMethod.POST,
            produces = MediaType.APPLICATION_JSON_VALUE,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    @Timed
    public ResponseEntity<VerifyUserResponse> verifyUser(@RequestBody VerifyUserRequest request) {

   serviceFacade.getRiskProfile(user.userId.id)
                .flatMap(ServiceFacade.RiskProfile::getAffordabilityCheck)
                        .ifPresent(ac -> {
                            String rg = ac.getRiskGroup().name();
                            VerifyUserResponse.VerifyUserResponseBuilder vur = VerifyUserResponse.builder();
                            vur.attributes.put("RiskGroup", rg);
                        });
 

Теперь я должен протестировать этот класс и посмотреть, что произойдет, если riskProfile то, что я получаю, там есть.

Я начал с чего-то вроде этого:

      def "should verify user"() {                                  
         given:                                                    
         def userId = "12345" 
    
     when:                                                  
     def res = mvc.perform(post(url)                        
             .content(json)                                 
             .contentType(MediaType.APPLICATION_JSON))      
             .andExpect(status().isOk())                    
             .andReturn()                                   
             .response                                      
                                                            
then: 1 * serviceFacade.getRiskProfile(user.userId.id) >> new ServiceFacade.RiskProfile("userId", 0, Instant.now(), Optional.empty(), Optional.empty())   
 

RiskProfile.java класс выглядит так:

     public class RiskProfile {
        public final UserId userId;
        public final long version;
        public final Instant created;
        public final Optional<Instant> lastUpdated;
        public final Optional<AffordabilityCheck> affordabilityCheck;

public RiskProfile(UserId userId, long version, Instant created, Optional<Instant> lastUpdated,
                       Optional<AffordabilityCheck> affordabilityCheck) {
        Validation.notNull(userId, "userId can not be null");
        Validation.notNull(created, "created can not be null");
        Validation.notNull(lastUpdated, "lastUpdated can not be null");
        Validation.notNull(affordabilityCheck, "affordabilityCheck can not be null");
        this.userId = userId;
        this.version = version;
        this.created = created;
        this.lastUpdated = lastUpdated;
        this.affordabilityCheck = affordabilityCheck;
    }

    public static RiskProfile create(UserId userId) {
        return new RiskProfile(userId, 0, Instant.now(), Optional.empty(), Optional.empty());
    }

    public static RiskProfile create(UserId userId, Optional<AffordabilityCheck> affordabilityCheck) {
        return new RiskProfile(userId, 0, Instant.now(), Optional.empty(), affordabilityCheck);
    
 

}

Когда я пытаюсь запустить свой тест, я получаю:

 Could not find matching constructor for: com.example.ServiceFacade$RiskProfile(String, String, Optional)
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.example.ServiceFacade$RiskProfile(String, String, Optional)

                                                     
 

Комментарии:

1.Что есть у к’тора? RiskRProfile

2. Что? 🙂 у вас там есть класс riskProfile

3. Он неполный, и final поля должны быть установлены в c’tor.

4. Можете ли вы привести пример кода? Извините, я не понимаю, что такое к’тор?

5. конструктор. ошибка заключается в том, что вы жалуетесь, что нет c’tor с аргументами, которые вы передаете. и ваш код не показывает c’tor внутри RiskProfile. таким образом, наиболее вероятная проблема здесь в том, что вы звоните не тому c’tor.

Ответ №1:

Вы вызываете следующее:

 new ServiceFacade.RiskProfile("userId", 0, Instant.now(), Optional.empty(), Optional.empty())  
 

Первым аргументом RiskProfile конструктора должен быть a UserId , а не a String .