com.redblackit.web.test.RestTemplateTestHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.redblackit.web.test.RestTemplateTestHelper.java

Source

/*
 * Copyright 2002-2011 the original author or authors, or Red-Black IT Ltd, as appropriate.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.redblackit.web.test;

import java.net.URI;
import java.util.Arrays;

import org.apache.log4j.Logger;
import org.junit.Assert;
import org.springframework.http.HttpStatus;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestTemplate;

/**
 * @author djnorth
 * 
 *         Class to help with error test cases with RestTemplate
 */
public class RestTemplateTestHelper {

    /**
     * Rest template
     */
    private RestTemplate restTemplate;

    /**
     * Logger to use
     */
    private Logger logger;

    /**
     * Constructor taking combination to test
     * 
     * @param restTemplate
     * @param logger
     */
    public RestTemplateTestHelper(RestTemplate restTemplate, Logger logger) {
        Assert.assertNotNull("restTemplate", restTemplate);
        Assert.assertNotNull("logger", logger);

        this.restTemplate = restTemplate;
        this.logger = logger;
    }

    /**
     * Test GET for object which should fail
     * 
     * @param url
     * @param urlArgs
     * @param assertMsg
     * @param expectedStatusCode
     */
    public void doGetForHttpStatusCodeException(String url, Object[] urlArgs, String assertMsg,
            HttpStatus expectedStatusCode) {
        StringBuilder builder = buildDebugMsg(url, urlArgs, assertMsg);
        builder.append(":getting object:expecting HttpStatusCodeException");
        try {
            Object obj = restTemplate.getForObject(url, Object.class, (urlArgs == null ? new Object[0] : urlArgs));
            Assert.fail(builder.append(":no exception:object returned=").append(obj).toString());
        } catch (HttpStatusCodeException hsce) {
            Assert.assertEquals(builder.append(":statusCode:hsce=").append(hsce.getMessage()).toString(),
                    expectedStatusCode, hsce.getStatusCode());
            logger.debug(builder.append(":OK"), hsce);
        }
    }

    /**
     * Test POST for location which should fail
     * 
     * @param url
     * @param objToPost
     * @param urlArgs
     * @param assertMsg
     * @param expectedStatusCode
     */
    public void doPostForHttpStatusCodeException(String url, Object objToPost, Object[] urlArgs, String assertMsg,
            HttpStatus expectedStatusCode) {
        StringBuilder builder = buildDebugMsg(url, urlArgs, assertMsg);
        builder.append(":posting object=").append(objToPost).append(":expecting HttpStatusCodeException");
        try {
            URI location = restTemplate.postForLocation(url, objToPost,
                    (urlArgs == null ? new Object[0] : urlArgs));
            Assert.fail(builder.append(":no exception:location returned=").append(location).toString());
        } catch (HttpStatusCodeException hsce) {
            Assert.assertEquals(builder.append(":statusCode:hsce=").append(hsce.getMessage()).toString(),
                    expectedStatusCode, hsce.getStatusCode());
            logger.debug(builder.append(":OK"), hsce);
        }
    }

    /**
     * Test PUT which should fail
     * 
     * @param url
     * @param objToPut
     * @param urlArgs
     * @param assertMsg
     * @param expectedStatusCode
     */
    public void doPutForHttpStatusCodeException(String url, Object objToPut, Object[] urlArgs, String assertMsg,
            HttpStatus expectedStatusCode) {
        StringBuilder builder = buildDebugMsg(url, urlArgs, assertMsg);
        builder.append(":putting object=").append(objToPut).append(":expecting HttpStatusCodeException");
        try {
            restTemplate.put(url, objToPut, (urlArgs == null ? new Object[0] : urlArgs));
            Assert.fail(builder.append(":no exception").toString());
        } catch (HttpStatusCodeException hsce) {
            Assert.assertEquals(builder.append(":statusCode:hsce=").append(hsce.getMessage()).toString(),
                    expectedStatusCode, hsce.getStatusCode());
            logger.debug(builder.append(":OK"), hsce);
        }
    }

    /**
     * Test DELETE which should fail
     * 
     * @param url
     * @param urlArgs
     * @param assertMsg
     * @param expectedStatusCode
     */
    public void doDeleteForHttpStatusCodeException(String url, Object[] urlArgs, String assertMsg,
            HttpStatus expectedStatusCode) {

        StringBuilder builder = buildDebugMsg(url, urlArgs, assertMsg);
        builder.append(":deleting object:expecting HttpStatusCodeException");
        try {
            restTemplate.delete(url, (urlArgs == null ? new Object[0] : urlArgs));
            Assert.fail(builder.append(":no exception").toString());
        } catch (HttpStatusCodeException hsce) {
            Assert.assertEquals(builder.append(":statusCode:hsce=").append(hsce.getMessage()).toString(),
                    expectedStatusCode, hsce.getStatusCode());
            logger.debug(builder.append(":OK"), hsce);
        }
    }

    /**
     * Test HEAD which should fail.
     * Note that the old HttpClient wrongly causes an IOException instead of a HttpStatusCodeException.
     * 
     * @param url
     * @param urlArgs
     * @param assertMsg
     * @param expectedStatusCode
     */
    public void doHeadForHttpStatusCodeException(String url, Object[] urlArgs, String assertMsg,
            HttpStatus expectedStatusCode) {

        StringBuilder builder = buildDebugMsg(url, urlArgs, assertMsg);
        builder.append(":getting headers:expecting HttpStatusCodeException");
        try {
            restTemplate.headForHeaders(url, (urlArgs == null ? new Object[0] : urlArgs));
            Assert.fail(builder.append(":no exception").toString());
        } catch (HttpStatusCodeException hsce) {
            Assert.assertEquals(builder.append(":statusCode:hsce=").append(hsce.getMessage()).toString(),
                    expectedStatusCode, hsce.getStatusCode());
            logger.debug(builder.append(":OK"), hsce);
        }
    }

    /**
     * Test OPTIONS which should fail
     * 
     * @param url
     * @param urlArgs
     * @param assertMsg
     * @param expectedStatusCode
     */
    public void doOptionsForHttpStatusCodeException(String url, Object[] urlArgs, String assertMsg,
            HttpStatus expectedStatusCode) {

        StringBuilder builder = buildDebugMsg(url, urlArgs, assertMsg);
        builder.append(":getting options:expecting HttpStatusCodeException");
        try {
            restTemplate.optionsForAllow(url, (urlArgs == null ? new Object[0] : urlArgs));
            Assert.fail(builder.append(":no exception").toString());
        } catch (HttpStatusCodeException hsce) {
            Assert.assertEquals(builder.append(":statusCode:hsce=").append(hsce.getMessage()).toString(),
                    expectedStatusCode, hsce.getStatusCode());
            logger.debug(builder.append(":OK"), hsce);
        }
    }

    /**
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return buildToString().toString();
    }

    /**
     * Create StringBuilder starting with our toString and set message
     * 
     * @param url
     * @param urlArgs
     * @param assertMsg
     */
    private StringBuilder buildDebugMsg(String url, Object[] urlArgs, String assertMsg) {
        StringBuilder builder = buildToString();

        builder.append(":url=").append(url);

        if (urlArgs != null) {
            builder.append(":urlArgs=").append(Arrays.toString(urlArgs));
        }

        if (assertMsg != null) {
            builder.append(':').append(assertMsg);
        }

        return builder;
    }

    /**
     * @return builder
     */
    private StringBuilder buildToString() {
        StringBuilder builder = new StringBuilder();
        builder.append("RestTemplateTestHelper [restTemplate=");
        builder.append(restTemplate);
        builder.append("]");
        return builder;
    }

}