Skip to main content

Junit Expected Exception checking Part2

It seems in my previous post the way I was sending error response was not the way UI was expecting it so I had to refactor code and used hibernate validator but it posed some issues in exception validation.

The code in REST api changed to

    public Response search(@Context User user, FolderSearchRequest folderSearchRequest) throws ApplicationException {

        Set<ConstraintViolation<FolderSearchRequest>> violationResult = validator.validate(folderSearchRequest);
        if (!violationResult.isEmpty()) {
            Set<ConstraintViolation<?>> violations = new HashSet<ConstraintViolation<?>>(violationResult);
            throw new ValidationException(violations);
        }

and the pojo changed to

@Data
@AllArgsConstructor
@NoArgsConstructor
public class FolderSearchRequest {
    public static final Integer DEFAULT_LIMIT = 30;
    public static final Integer DEFAULT_OFFSET = 0;
    @NotBlank
    @Size(min = 3)
    private String query;

    @Range(min = 0)
    private Integer offset = DEFAULT_OFFSET;

    @Range(min = 1)
    private Integer limit = DEFAULT_LIMIT;

}

Only issue is the ValidationException had a constant message so my expectMessage wont work. I had to now really get the real exception out of ExpectedException and match it, for this I had to write an Exception Matcher (not the most beautiful code but for the temporary api its ok).


    @AllArgsConstructor
    private static class ValidationExceptionMatcher extends TypeSafeMatcher<ValidationException> {

        private String descriptionText;
        private String msgPrefix;

        @Override
        public boolean matchesSafely(ValidationException item) {
            Set<ConstraintViolation<?>> violations = item.getConstraintViolations();
            if (violations.size() == 1) {
                ConstraintViolation<?> violation = violations.iterator().next();
                return violation.getMessage().startsWith(msgPrefix);
            }
            return false;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText(descriptionText);
        }
    }

    @Test
    public void testQueryMinimumChars() throws ApplicationException {
        expectedException.expect(ValidationException.class);
        expectedException.expectMessage("constraint violations");
        expectedException.expect(new ValidationExceptionMatcher("Size", "Size must be between 3 and"));
        sut.search(null, new FolderSearchRequest("te", 0, 20));
    }



Comments

Popular posts from this blog

Consistency

Consistency is important as it makes people feel at home and instills trust in the brand. The iOS ecosystem makes it easy for people to transition from one device type to other because it has a consistent look and feel, actions and this way the brain doesn't have to apply any cognitive effort when moving from iPhone to iPad to a Mac. I learned about Keynotopia recently and was enlightened by its application. I saw the transition of a bootstrapped Startup to a consistent Enterprise Startup and this is why I see the importance of consistency introduction in every department at Startup as early as possible. The UX style needs to be consistent with the entire product line and a company-wide style guide maintained by the UX group is absolutely important from very early days of the Startup. Your button color, fonts, logos need to be consistent in each product and even company presentations. From the moment a customer lands on your Marketing website to the trial perio...

Adventures of a nature lover - 5 national parks in 14 days

To unplug from work and recharge myself I do a 2-3 week trip every year where I am unplugged. Few of the reasons I can totally unplug from work is Unlimited Vacation policy of Egnyte,  Excellent support by the Infrastructure team  Our ethos of pro-actively fixing issues before they become nuisance. TLDR; It's a long post so you can scroll down and first see see images if you need motivation to read it entirely. Me and my family like national parks and camping to recharge us as there is no cell phone  coverage in parks and you are completely unplugged from technology most of the times. We have done many of the national parks nearby and this year we want to see glacier national park as the glaciers may disappear in 10-15 years so see them before they are gone. Behind every successful trip is a "Trip planner" and for our family its my wife, she researched  and made a trip itinerary book. She booked camp sites 6 months in advance She researched trail...

IPhone will beat DSLR in long run

I started taking interest in photography recently and have accumulated a decent amount of gear but I am realizing that the ease of taking out your phone and clicking picture will beat the DSLR in long run. A friend recently visited me from NY and we wanted to take a family picture and I was setting up Tripod and Flash and doing settings changes and he was like leave all this, lets take a Selfie and that’s it, in 2 second the picture was done and he shared it on facebook in another 1 second.  Now one can argue that DSLR would have clicked a better picture but DSLR has many things going against it:- Learning curve : I must have spent 200+hours on reading about photography but still cant take decent pictures as my bar is high. Not everyone is interested in spending this much time. Amount of gear to be carried : On hikes its a pain to carry your DSLR whereas your phone has to be anyway with you. Cognitive effort of tweaking the gear: You have to have a different lens/settings for d...