Showing posts with label junit. Show all posts
Showing posts with label junit. Show all posts

Thursday, 13 September 2012

Maven generate HTML Junit report

  • add to pom.xml
  • 
        org.apache.maven.plugins
        maven-surefire-plugin
        
            true
        
    
    
    
        org.jvnet.maven-antrun-extended-plugin
        maven-antrun-extended-plugin
        
            
                test-reports
                test
                
                    
                        
                            
                                
                            
                            
                        
                    
                
                
                    run
                
            
        
        
            
                org.apache.ant
                ant-junit
                1.8.4
            
            
                org.apache.ant
                ant-trax
                1.8.0
            
        
    
    
  • Don't bind the AntRun plugin to the test phase, move the configuration outside the execution and call mvn antrun:run on the command line to generate the reports when wanted.
  • Or use the testFailureIgnore option of the test mojo and set it to true in the surefire plugin
  • Use maven command arguments
  • $mvn test -Dmaven.test.failure.ignore=true
    

Thursday, 19 April 2012

How to unit test with @ResponseBody return Json in Spring MVC controller

  1. model
  2. public class Dealer {
        private String id;
        private String name;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
  3. Controller
  4. import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Controller
    @RequestMapping("/dealer")
    public class DealerController {
        @Resource(name = "dealerService")
        private DealerService dealerService;
    
        @RequestMapping("json/all")
        public @ResponseBody List<Dealer> getAllDealers() {
            return dealerService.getAllDealers();
        }
    }
    
  5. applicationContext.xml
  6. 
        
            
                <entry key="xml" value="application/xml" />
                <entry key="json" value="application/json" />
            
        
        
            
               <bean class="org.springframework.web.servlet.view.xml.MarshallingView" p:marshaller-ref="unmarshaller" />
               <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" p:objectMapper-ref="jacksonJsonObjectMapper" />
            
        
    
    
    
        <oxm:class-to-be-bound name="mypackge.Dealer"/>
    
    
  7. Unit test
  8. import com.google.common.collect.Lists;
    import org.apache.http.HttpHeaders;
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
    import org.springframework.mock.web.MockHttpServletRequest;
    import org.springframework.mock.web.MockHttpServletResponse;
    import org.springframework.test.util.ReflectionTestUtils;
    import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
    
    import java.util.List;
    
    import static org.junit.Assert.assertEquals;
    import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.when;
    
    public class TestDealerController {
        private DealerController dealerController;
    
        @Before
        public void before() throws Exception {
            DealerService dealerService = mock(DealerService.class);
            when(dealerService.getAllDealers()).thenReturn(mockDealers());
            
            dealerController = new DealerController();
            ReflectionTestUtils.setField(dealerController, "dealerService", dealerService);
        }
    
        @Test
        public void testGetAllDealers() throws Exception {
            MockHttpServletRequest mockRequest = new MockHttpServletRequest();
            mockRequest.setContentType(MediaType.APPLICATION_JSON.toString());
            mockRequest.addHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON.toString());
            mockRequest.setMethod("GET");
            mockRequest.setRequestURI("/dealer/json/all");
    
            AnnotationMethodHandlerAdapter handlerAdapter = new AnnotationMethodHandlerAdapter();
            HttpMessageConverter[] messageConverters = {new MappingJacksonHttpMessageConverter()};
            handlerAdapter.setMessageConverters(messageConverters);
    
            MockHttpServletResponse mockResponse = new MockHttpServletResponse();
            handlerAdapter.handle(mockRequest, mockResponse, dealerController);
    
            String expected="[{\"id\":\"01\",\"name\":\"dealer-01\"}, {\"id\":\"02\",\"name\":\"dealer-02\"}]";
            assertEquals(expected, mockResponse.getContentAsString());
        }
    
        private List<Dealer> mockDealers() {
            Dealer dealer01 = new Dealer();
            dealer01.setId("01");
            dealer01.setName("dealer-01");
    
            Dealer dealer02 = new Dealer();
            dealer02.setId("02");
            dealer02.setName("dealer-02");
    
            return Lists.newArrayList(dealer01, dealer02);
        }
    
  9. reference
  10. Spring Framework TEST RESTful Web Service (Controller) Offline i.e. No Server, No Database

Wednesday, 29 February 2012

How to mock http servlet with jetty to test some http-post,http-get in unit test?

Solution:
1. Write you own mock servlet
public class MockServlet extends HttpServlet {
    private String servletData;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        contextService(req, resp);
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    private void contextService(HttpServletRequest req, HttpServletResponse resp)  throws ServletException, IOException {
        servletData = IOUtils.toString(req.getInputStream());

        resp.setContentType("text/html");
        resp.setStatus(HttpServletResponse.SC_OK);
        resp.getWriter().print("Response from mock server: Submit is success.");
    }

    public String getServletData() {
        return servletData;
    }
}

2. define mock beans in spring application context (servlet and jetty server)
2.1 servlet:

<bean id="mockServlet" class="my.MockServlet"/>

2.2 jetty server

        
            
                
                    <property name="host" value="localhost"/>
                    <property name="port" value="8900"/>
                
            
        
        
            
                
                    <property name="contextPath" value="/"/>
                    
                        <bean class="org.mortbay.jetty.servlet.SessionHandler">
                    
                    <property name="resourceBase" value="c:/temp"/>
                    
                        
                            
                            
                                
                                    
                                    
                                        <property name="name" value="defaultServlet"/>
                                        
                                            <bean class="org.mortbay.jetty.servlet.DefaultServlet"/>
                                        
                                        
                                            
                                                <entry key="resourceBase" value="./"/>
                                            
                                        
                                    
                                    
                                        <property name="name" value="mockServlet"/>
                                        <property name="servlet" ref="mockServlet"/>
                                        
                                            
                                                <entry key="resourceBase" value="./"/>
                                            
                                        
                                    
                                
                            
                            
                                
                                    
                                        
                                            
                                                /
                                            
                                        
                                        <property name="servletName" value="defaultServlet"/>
                                    
                                    
                                        
                                            
                                                /test/myAction
                                            
                                        
                                        <property name="servletName" value="mockCharityServlet"/>
                                    
                                
                            
                        
                    
                
                
                
            
        
    


3. You Http Client code

final HttpPost post = new HttpPost("http://127.0.0.1:9800/test/myAction");
final HttpResponse resp = hc.execute(post);
final HttpEntity respContent = resp.getEntity();
final InputStream is = respContent.getContent();
final StringWriter strWr = new StringWriter();
IOUtils.copy(is, strWr);
return strWr.toString();

4. Junit
String expected = "Response from mock server: Submit is success.";
String actual = mockClient.submit();
assertEquals(expected, actual);

How to test email of junit

How can it test email of junit? Solution use dumbster as a fake smtp server 1. add dependency to pom.xml

    dumbster
    dumbster
    1.6
    test

2. add bean definition to spring applicationContext.xml

    <constructor-arg index="0" value="2525"/>

using javax mail session

    
        
            127.0.0.1
            2525
        
    


    <constructor-arg ref="mailSession" type="javax.mail.Session"/>

or if you using spring mail sender:
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl" id="mailSender" p:host="localhost" p:port="2525"/>
3. define one util class
import com.dumbster.smtp.SimpleSmtpServer;
import com.dumbster.smtp.SmtpMessage;
import com.dumbster.smtp.SmtpResponse;
import com.dumbster.smtp.SmtpState;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

import java.util.Iterator;

public class BodySmtpMessage extends TypeSafeMatcher<Smtpmessage> {
    private SmtpMessage smtpMessage;

    public BodySmtpMessage(SmtpMessage smtpMessage) {
        this.smtpMessage = smtpMessage;
    }

    @Override
    public boolean matchesSafely(SmtpMessage smtpMessage) {
        return smtpMessage.getBody().equals(smtpMessage.getBody());
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("not same body message");
    }

    @Factory
    public static <T> Matcher<smtpmessage> bodyEqualTo(SmtpMessage smtpMessage) {
        return new BodySmtpMessage(smtpMessage);
    }

    public static SmtpMessage getExpectedSmtpMessage(String body) {
        SmtpResponse smtpResponse = new SmtpResponse(1, "", SmtpState.DATA_BODY);
        SmtpMessage expectedMessage = new SmtpMessage();
        expectedMessage.store(smtpResponse, body);

        return expectedMessage;
    }

    public static SmtpMessage getFirstReceivedMessage(SimpleSmtpServer simpleSmtpServer) {
        Iterator<smtpmessage> receivedEmail = simpleSmtpServer.getReceivedEmail();

        while (receivedEmail.hasNext()) {
            return receivedEmail.next();
        }
        return null;
    }
}
4. Junit
import com.dumbster.smtp.SimpleSmtpServer;
import com.dumbster.smtp.SimpleSmtpServer;
import com.dumbster.smtp.SmtpMessage;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

import static au.com.hothouse.toyota.utils.email.BodySmtpMessage.*;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:applicationContext-test.xml")
public class TestEmailerImpl {
    @Resource(name = "saveYourCarEmailer")
    private EmailerImpl emailer;
    @Resource(name = "fakeSmtpServer")
    private SimpleSmtpServer simpleSmtpServer;

    private static String EXPECTED = "Dear Jianjun Shou,\n" +
            "\n" +
            "Here is the permanent link to the vehicle you have created:\n" +
            "\n" +
            "http://test.email.hothouse.com.au\n" +
            "\n" +
            "Thank you for vising the Toyota website.\n" +
            "\n" +
            "Regards,\n" +
            "\n" +
            "The Toyota Team";

    @Test
    public void testEmail() throws Exception {
        emailer.email("Jianjun", "Shou", "sean.shou@hothouse.com.au", "http://test.email.hothouse.com.au");
        assertTrue("test failed", simpleSmtpServer.getReceivedEmailSize() > 0);
        SmtpMessage sentMessage = getFirstReceivedMessage(simpleSmtpServer);
        SmtpMessage expectedSmtpMessage = getExpectedSmtpMessage(EXPECTED);
        assertThat(sentMessage, is(bodyEqualTo(expectedSmtpMessage)));
    }
}

Tuesday, 13 December 2011

Write JUnit test for XSLT

Firstly, you just create a Util Class for xslt transformer:
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.InputStream;
import java.io.StringWriter;

public class XsltTransformer {
    public static String transformer(InputStream xml, InputStream xslt) throws TransformerException {
        Source xmlSource = new StreamSource(xml);
        StringWriter stringWriter = new StringWriter();
        Result result = new StreamResult(stringWriter);

        TransformerFactory transFact = TransformerFactory.newInstance();
        Source xsltSource = new StreamSource(xslt);
        Transformer trans = transFact.newTransformer(xsltSource);
        trans.setOutputProperty(OutputKeys.INDENT, "yes");
        trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");

        trans.transform(xmlSource, result);
        return stringWriter.getBuffer().toString();
    }
}

Secondly, combined with XMLUnit, Junit to verify
@Test
    public void testXSLT() {
        InputStream expectedOutput = ODSEventXsltTest.class.getResourceAsStream("ods-output.xml");
        InputStream xml = ODSEventXsltTest.class.getResourceAsStream("ods.xml");
        InputStream xslt = ODSEventXsltTest.class.getResourceAsStream("SSNOdsExportToCannonical.xsl");

        try {
            String actual = XsltTransformer.transformer(xml, xslt);
            String expected = IOUtils.toString(expectedOutput);
            XMLUnit.setIgnoreWhitespace(true);
            Diff diff = XMLUnit.compareXML(expected, actual);
            String errorMessage = "\nexpected:\n" + expected + "\n-------------------------------------\nbut actual: \n" + actual + "\n>>>>" + diff.toString();
            assertTrue(errorMessage, diff.similar());
        } catch (TransformerException e) {
            fail(e.getLocalizedMessage());
        } catch (SAXException e) {
            fail(e.getLocalizedMessage());
        } catch (IOException e) {
            fail(e.getLocalizedMessage());
        }
    }

How to write unit test for private method in java

/**
  * Method: parseDateTime(String text)
 */
 @Test
 public void testParseDateTime() throws Exception {
     try {
        CsvToXml csvToXml = new CsvToXml();
        Method method = CsvToXml.class.getDeclaredMethod("parseDateTime", String.class);
        method.setAccessible(true);
        String actual = (String) method.invoke(csvToXml, "2011-11-08T13:04:31.000+11:00");
        String expect = "2011-11-08T12:04:31Z";
        assertEquals(expect, actual);
     } catch (NoSuchMethodException e) {
        fail(e.getMessage());
     } catch (IllegalAccessException e) {
        fail();
     } catch (InvocationTargetException e) {
        fail();
     }
}

BTW. Another choice is PowerMock Framework