spring boot test (#1322)

* spring boot test

* testing in spring boot article
This commit is contained in:
Ahmed-Saied 2017-03-07 18:01:44 +02:00 committed by Grzegorz Piwowarek
parent 6fbf90fd27
commit a7bafc0775
13 changed files with 337 additions and 1 deletions

View File

@ -106,6 +106,12 @@
<version>${jquery.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>

View File

@ -0,0 +1,58 @@
package org.baeldung.boot.components;
import org.baeldung.boot.exceptions.CommonException;
import org.baeldung.boot.exceptions.FooNotFoundException;
import org.baeldung.boot.model.Foo;
import org.baeldung.boot.repository.FooRepository;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.common.base.Preconditions;
@Component
public class FooComponent {
@Autowired
private FooRepository fooRepository;
private final static Logger logger = org.slf4j.LoggerFactory.getLogger(FooComponent.class);
public Foo getFooWithId(Integer id) {
Foo foo = null;
try {
foo = fooRepository.findOne(id);
Preconditions.checkNotNull(foo);
logger.info("Foo with Id {} found",id);
}catch(NullPointerException ex){
logger.error("Foo with Id {} was not found",id);
throw new FooNotFoundException("The given foo Id was not found");
} catch (Exception ex) {
logger.error("Error while retrieving Foo with Id {} found",id,ex);
throw new CommonException("Error while retrieving foo");
}
return foo;
}
public Foo getFooWithName(String name) {
Foo foo = null;
try {
foo = fooRepository.findByName(name);
Preconditions.checkNotNull(foo);
logger.info("Foo with name {} found",name);
}catch(NullPointerException ex){
logger.error("Foo with name {} was not found",name);
throw new FooNotFoundException("The given foo name was not found");
} catch (Exception ex) {
logger.error("Error while retrieving Foo with name {} found",name,ex);
throw new CommonException("Error while retrieving foo");
}
return foo;
}
}

View File

@ -0,0 +1,13 @@
package org.baeldung.boot.exceptions;
public class CommonException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = 3080004140659213332L;
public CommonException(String message){
super(message);
}
}

View File

@ -0,0 +1,13 @@
package org.baeldung.boot.exceptions;
public class FooNotFoundException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = 9042200028456133589L;
public FooNotFoundException(String message){
super(message);
}
}

View File

@ -21,6 +21,13 @@ public class Foo implements Serializable {
this.name = name;
}
public Foo(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}

View File

@ -0,0 +1,52 @@
package org.baeldung.boot.service;
import org.baeldung.boot.components.FooComponent;
import org.baeldung.boot.exceptions.CommonException;
import org.baeldung.boot.exceptions.FooNotFoundException;
import org.baeldung.boot.model.Foo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FooService {
@Autowired
private FooComponent fooComponent;
@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getFooWithId(@PathVariable Integer id) {
Foo foo = fooComponent.getFooWithId(id);
return new ResponseEntity<Foo>(foo, HttpStatus.OK);
}
@RequestMapping(value = "/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getFooWithName(@RequestParam String name) {
Foo foo = fooComponent.getFooWithName(name);
return new ResponseEntity<Foo>(foo, HttpStatus.OK);
}
@ExceptionHandler(value = FooNotFoundException.class)
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Foo not found")
public void handleFooNotFoundException() {
}
@ExceptionHandler(value = CommonException.class)
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "Common exception")
public void handleCommonException() {
}
}

View File

@ -0,0 +1,68 @@
package org.baeldung.boot;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doReturn;
import java.util.HashMap;
import java.util.Map;
import org.baeldung.boot.components.FooComponent;
import org.baeldung.boot.model.Foo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
public class FooComponentTests {
@Autowired
private TestRestTemplate testRestTemplate;
@SpyBean
private FooComponent fooComponent;
@Before
public void init() {
Foo foo = new Foo();
foo.setId(5);
foo.setName("MOCKED_FOO");
doReturn(foo).when(fooComponent).getFooWithId(anyInt());
// doCallRealMethod().when(fooComponent).getFooWithName(anyString());
}
@Test
public void givenInquiryingFooWithId_whenFooComponentIsMocked_thenAssertMockedResult() {
Map<String, String> pathVariables = new HashMap<String, String>();
pathVariables.put("id", "1");
ResponseEntity<Foo> fooResponse = testRestTemplate.getForEntity("/{id}", Foo.class, pathVariables);
assertNotNull(fooResponse);
assertEquals(HttpStatus.OK, fooResponse.getStatusCode());
assertEquals(5, fooResponse.getBody().getId().longValue());
assertEquals("MOCKED_FOO", fooResponse.getBody().getName());
}
@Test
public void givenInquiryingFooWithName_whenFooComponentIsMocked_thenAssertMockedResult() {
Map<String, String> pathVariables = new HashMap<String, String>();
pathVariables.put("name", "Foo_Name");
ResponseEntity<Foo> fooResponse = testRestTemplate.getForEntity("/?name={name}", Foo.class, pathVariables);
assertNotNull(fooResponse);
assertEquals(HttpStatus.OK, fooResponse.getStatusCode());
assertEquals(1, fooResponse.getBody().getId().longValue());
}
}

View File

@ -0,0 +1,43 @@
package org.baeldung.boot;
import java.util.HashMap;
import java.util.Map;
import org.baeldung.boot.DemoApplication;
import org.baeldung.boot.model.Foo;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes=DemoApplication.class,webEnvironment = WebEnvironment.RANDOM_PORT)
public class FooIntegrationTest {
@Autowired
private TestRestTemplate testRestTemplate;
@Test
public void givenInquiryingFooWithId_whenIdIsValid_thenHttpStatusOK(){
Map<String,String> pathVariables = new HashMap<String,String>();
pathVariables.put("id", "1");
ResponseEntity<Foo> fooResponse = testRestTemplate.getForEntity("/{id}", Foo.class, pathVariables);
Assert.assertNotNull(fooResponse);
Assert.assertEquals(HttpStatus.OK,fooResponse.getStatusCode());
}
@Test
public void givenInquiryingFooWithName_whenNameIsValid_thenHttpStatusOK(){
Map<String,String> pathVariables = new HashMap<String,String>();
pathVariables.put("name", "Foo_Name");
ResponseEntity<Foo> fooResponse = testRestTemplate.getForEntity("/?name={name}", Foo.class, pathVariables);
Assert.assertNotNull(fooResponse);
Assert.assertEquals(HttpStatus.OK,fooResponse.getStatusCode());
}
}

View File

@ -0,0 +1,34 @@
package org.baeldung.boot;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.baeldung.boot.model.Foo;
import org.baeldung.boot.repository.FooRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@DataJpaTest
public class FooJPATest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private FooRepository repository;
@Test
public void findFooByName() {
this.entityManager.persist(new Foo("Foo_Name_2"));
Foo foo = this.repository.findByName("Foo_Name_2");
assertNotNull(foo);
assertEquals("Foo_Name_2",foo.getName());
// Due to having Insert query for Foo with Id 1, so TestEntityManager generates new Id of 2
assertEquals(2l,foo.getId().longValue());
}
}

View File

@ -0,0 +1,35 @@
package org.baeldung.boot;
import static org.assertj.core.api.Assertions.assertThat;
import org.baeldung.boot.model.Foo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.JsonTest;
import org.springframework.boot.test.json.JacksonTester;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@JsonTest
public class FooJsonTest {
@Autowired
private JacksonTester<Foo> json;
@Test
public void testSerialize() throws Exception {
Foo foo = new Foo(3, "Foo_Name_3");
assertThat(this.json.write(foo)).isEqualToJson("expected.json");
assertThat(this.json.write(foo)).hasJsonPathStringValue("@.name");
assertThat(this.json.write(foo)).extractingJsonPathStringValue("@.name").isEqualTo("Foo_Name_3");
}
@Test
public void testDeserialize() throws Exception {
String content = "{\"id\":4,\"name\":\"Foo_Name_4\"}";
assertThat(this.json.parseObject(content).getName()).isEqualTo("Foo_Name_4");
assertThat(this.json.parseObject(content).getId()==4);
}
}

View File

@ -1,3 +1,5 @@
spring.mail.host=localhost
spring.mail.port=8025
spring.mail.properties.mail.smtp.auth=false
spring.mail.properties.mail.smtp.auth=false
security.basic.enabled=false

View File

@ -0,0 +1 @@
Insert into Foo values(1,'Foo_Name');

View File

@ -0,0 +1,4 @@
{
"id":3,
"name":"Foo_Name_3"
}