spring boot test (#1322)
* spring boot test * testing in spring boot article
This commit is contained in:
parent
6fbf90fd27
commit
a7bafc0775
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
Insert into Foo values(1,'Foo_Name');
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"id":3,
|
||||
"name":"Foo_Name_3"
|
||||
}
|
Loading…
Reference in New Issue