Skip to content

Commit 2398c4d

Browse files
committed
Merge pull request #119 from colinbut/master
Added test classes for Controllers plus tests for PetTypeFormatter
2 parents c65cfb6 + 845d31e commit 2398c4d

File tree

7 files changed

+523
-6
lines changed

7 files changed

+523
-6
lines changed

pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
<!-- Test -->
2828
<assertj.version>2.2.0</assertj.version>
29+
<mockito.version>1.10.19</mockito.version>
30+
<hamcrest.version>1.3</hamcrest.version>
2931

3032
<!-- Dates -->
3133
<jodatime-hibernate.version>1.3</jodatime-hibernate.version>
@@ -238,6 +240,17 @@
238240
<version>${assertj.version}</version>
239241
<scope>test</scope>
240242
</dependency>
243+
<dependency>
244+
<groupId>org.mockito</groupId>
245+
<artifactId>mockito-all</artifactId>
246+
<version>${mockito.version}</version>
247+
<scope>test</scope>
248+
</dependency>
249+
<dependency>
250+
<groupId>org.hamcrest</groupId>
251+
<artifactId>hamcrest-all</artifactId>
252+
<version>${hamcrest.version}</version>
253+
</dependency>
241254

242255
<!-- Dandelion -->
243256
<dependency>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.springframework.samples.petclinic.web;
2+
3+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
4+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
5+
6+
import org.junit.Before;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.test.context.ActiveProfiles;
11+
import org.springframework.test.context.ContextConfiguration;
12+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
13+
import org.springframework.test.context.web.WebAppConfiguration;
14+
import org.springframework.test.web.servlet.MockMvc;
15+
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
16+
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
17+
18+
/**
19+
* Test class for {@link CrashController}
20+
*
21+
* @author Colin But
22+
*/
23+
@RunWith(SpringJUnit4ClassRunner.class)
24+
@ContextConfiguration({"classpath:spring/business-config.xml", "classpath:spring/tools-config.xml", "classpath:spring/mvc-core-config.xml"})
25+
@WebAppConfiguration
26+
@ActiveProfiles("spring-data-jpa")
27+
public class CrashControllerTests {
28+
29+
@Autowired
30+
private CrashController crashController;
31+
32+
@Autowired
33+
private SimpleMappingExceptionResolver simpleMappingExceptionResolver;
34+
35+
private MockMvc mockMvc;
36+
37+
@Before
38+
public void setup() {
39+
this.mockMvc = MockMvcBuilders
40+
.standaloneSetup(crashController)
41+
.setHandlerExceptionResolvers(simpleMappingExceptionResolver)
42+
.build();
43+
}
44+
45+
@Test
46+
public void testTriggerException() throws Exception {
47+
mockMvc.perform(get("/oups"))
48+
.andExpect(view().name("exception"))
49+
.andExpect(model().attributeExists("exception"))
50+
.andExpect(forwardedUrl("exception"))
51+
.andExpect(status().isOk());
52+
}
53+
}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package org.springframework.samples.petclinic.web;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
import org.junit.runner.RunWith;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.test.context.ActiveProfiles;
8+
import org.springframework.test.context.ContextConfiguration;
9+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
10+
import org.springframework.test.context.web.WebAppConfiguration;
11+
import org.springframework.test.web.servlet.MockMvc;
12+
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
13+
14+
import static org.hamcrest.Matchers.hasProperty;
15+
import static org.hamcrest.Matchers.is;
16+
17+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
18+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
19+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
20+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
21+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
22+
23+
/**
24+
* Test class for {@link OwnerController}
25+
*
26+
* @author Colin But
27+
*/
28+
@RunWith(SpringJUnit4ClassRunner.class)
29+
@ContextConfiguration({"classpath:spring/business-config.xml", "classpath:spring/tools-config.xml", "classpath:spring/mvc-core-config.xml"})
30+
@WebAppConfiguration
31+
@ActiveProfiles("spring-data-jpa")
32+
public class OwnerControllerTests {
33+
34+
private static final int TEST_OWNER_ID = 1;
35+
36+
@Autowired
37+
private OwnerController ownerController;
38+
39+
private MockMvc mockMvc;
40+
41+
@Before
42+
public void setup() {
43+
this.mockMvc = MockMvcBuilders.standaloneSetup(ownerController).build();
44+
}
45+
46+
@Test
47+
public void testInitCreationForm() throws Exception {
48+
mockMvc.perform(get("/owners/new"))
49+
.andExpect(status().isOk())
50+
.andExpect(model().attributeExists("owner"))
51+
.andExpect(view().name("owners/createOrUpdateOwnerForm"));
52+
}
53+
54+
@Test
55+
public void testProcessCreationFormSuccess() throws Exception {
56+
mockMvc.perform(post("/owners/new")
57+
.param("firstName", "Joe")
58+
.param("lastName", "Bloggs")
59+
.param("address", "123 Caramel Street")
60+
.param("city", "London")
61+
.param("telephone", "01316761638")
62+
)
63+
.andExpect(status().is3xxRedirection());
64+
}
65+
66+
@Test
67+
public void testProcessCreationFormHasErrors() throws Exception {
68+
mockMvc.perform(post("/owners/new")
69+
.param("firstName", "Joe")
70+
.param("lastName", "Bloggs")
71+
.param("city", "London")
72+
)
73+
.andExpect(status().isOk())
74+
.andExpect(model().attributeHasErrors("owner"))
75+
.andExpect(model().attributeHasFieldErrors("owner", "address"))
76+
.andExpect(model().attributeHasFieldErrors("owner", "telephone"))
77+
.andExpect(view().name("owners/createOrUpdateOwnerForm"));
78+
}
79+
80+
@Test
81+
public void testInitFindForm() throws Exception {
82+
mockMvc.perform(get("/owners/find"))
83+
.andExpect(status().isOk())
84+
.andExpect(model().attributeExists("owner"))
85+
.andExpect(view().name("owners/findOwners"));
86+
}
87+
88+
@Test
89+
public void testProcessFindFormSuccess() throws Exception {
90+
mockMvc.perform(get("/owners"))
91+
.andExpect(status().isOk())
92+
.andExpect(view().name("owners/ownersList"));
93+
}
94+
95+
@Test
96+
public void testProcessFindFormByLastName() throws Exception {
97+
mockMvc.perform(get("/owners")
98+
.param("lastName", "Franklin")
99+
)
100+
.andExpect(status().is3xxRedirection())
101+
.andExpect(view().name("redirect:/owners/" + TEST_OWNER_ID));
102+
}
103+
104+
@Test
105+
public void testProcessFindFormNoOwnersFound() throws Exception {
106+
mockMvc.perform(get("/owners")
107+
.param("lastName", "Unknown Surname")
108+
)
109+
.andExpect(status().isOk())
110+
.andExpect(model().attributeHasFieldErrors("owner", "lastName"))
111+
.andExpect(model().attributeHasFieldErrorCode("owner", "lastName", "notFound"))
112+
.andExpect(view().name("owners/findOwners"));
113+
}
114+
115+
@Test
116+
public void testInitUpdateOwnerForm() throws Exception {
117+
mockMvc.perform(get("/owners/{ownerId}/edit", TEST_OWNER_ID))
118+
.andExpect(status().isOk())
119+
.andExpect(model().attributeExists("owner"))
120+
.andExpect(model().attribute("owner", hasProperty("lastName", is("Franklin"))))
121+
.andExpect(model().attribute("owner", hasProperty("firstName", is("George"))))
122+
.andExpect(model().attribute("owner", hasProperty("address", is("110 W. Liberty St."))))
123+
.andExpect(model().attribute("owner", hasProperty("city", is("Madison"))))
124+
.andExpect(model().attribute("owner", hasProperty("telephone", is("6085551023"))))
125+
.andExpect(view().name("owners/createOrUpdateOwnerForm"));
126+
}
127+
128+
@Test
129+
public void testProcessUpdateOwnerFormSuccess() throws Exception {
130+
mockMvc.perform(post("/owners/{ownerId}/edit", TEST_OWNER_ID)
131+
.param("firstName", "Joe")
132+
.param("lastName", "Bloggs")
133+
.param("address", "123 Caramel Street")
134+
.param("city", "London")
135+
.param("telephone", "01616291589")
136+
)
137+
.andExpect(status().is3xxRedirection())
138+
.andExpect(view().name("redirect:/owners/{ownerId}"));
139+
}
140+
141+
@Test
142+
public void testProcessUpdateOwnerFormHasErrors() throws Exception {
143+
mockMvc.perform(post("/owners/{ownerId}/edit", TEST_OWNER_ID)
144+
.param("firstName", "Joe")
145+
.param("lastName", "Bloggs")
146+
.param("city", "London")
147+
)
148+
.andExpect(status().isOk())
149+
.andExpect(model().attributeHasErrors("owner"))
150+
.andExpect(model().attributeHasFieldErrors("owner", "address"))
151+
.andExpect(model().attributeHasFieldErrors("owner", "telephone"))
152+
.andExpect(view().name("owners/createOrUpdateOwnerForm"));
153+
}
154+
155+
@Test
156+
public void testShowOwner() throws Exception {
157+
mockMvc.perform(get("/owners/{ownerId}", TEST_OWNER_ID))
158+
.andExpect(status().isOk())
159+
.andExpect(model().attribute("owner", hasProperty("lastName", is("Franklin"))))
160+
.andExpect(model().attribute("owner", hasProperty("firstName", is("George"))))
161+
.andExpect(model().attribute("owner", hasProperty("address", is("110 W. Liberty St."))))
162+
.andExpect(model().attribute("owner", hasProperty("city", is("Madison"))))
163+
.andExpect(model().attribute("owner", hasProperty("telephone", is("6085551023"))))
164+
.andExpect(view().name("owners/ownerDetails"));
165+
}
166+
167+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package org.springframework.samples.petclinic.web;
2+
3+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
4+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
5+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
6+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
7+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
8+
9+
import org.junit.Before;
10+
import org.junit.Test;
11+
import org.junit.runner.RunWith;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.format.support.FormattingConversionServiceFactoryBean;
14+
import org.springframework.test.context.ActiveProfiles;
15+
import org.springframework.test.context.ContextConfiguration;
16+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
17+
import org.springframework.test.context.web.WebAppConfiguration;
18+
import org.springframework.test.web.servlet.MockMvc;
19+
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
20+
21+
/**
22+
* Test class for the {@link PetController}
23+
*
24+
* @author Colin But
25+
*/
26+
@RunWith(SpringJUnit4ClassRunner.class)
27+
@ContextConfiguration({"classpath:spring/business-config.xml", "classpath:spring/tools-config.xml", "classpath:spring/mvc-core-config.xml"})
28+
@WebAppConfiguration
29+
@ActiveProfiles("spring-data-jpa")
30+
public class PetControllerTests {
31+
32+
private static final int TEST_OWNER_ID = 1;
33+
private static final int TEST_PET_ID = 1;
34+
35+
@Autowired
36+
private PetController petController;
37+
38+
@Autowired
39+
private FormattingConversionServiceFactoryBean formattingConversionServiceFactoryBean;
40+
41+
private MockMvc mockMvc;
42+
43+
@Before
44+
public void setup() {
45+
this.mockMvc = MockMvcBuilders
46+
.standaloneSetup(petController)
47+
.setConversionService(formattingConversionServiceFactoryBean.getObject())
48+
.build();
49+
}
50+
51+
@Test
52+
public void testInitCreationForm() throws Exception {
53+
mockMvc.perform(get("/owners/{ownerId}/pets/new", TEST_OWNER_ID))
54+
.andExpect(status().isOk())
55+
.andExpect(view().name("pets/createOrUpdatePetForm"))
56+
.andExpect(model().attributeExists("pet"));
57+
}
58+
59+
@Test
60+
public void testProcessCreationFormSuccess() throws Exception {
61+
mockMvc.perform(post("/owners/{ownerId}/pets/new", TEST_OWNER_ID)
62+
.param("name", "Betty")
63+
.param("type", "hamster")
64+
.param("birthDate", "2015/02/12")
65+
)
66+
.andExpect(status().is3xxRedirection())
67+
.andExpect(view().name("redirect:/owners/{ownerId}"));
68+
}
69+
70+
@Test
71+
public void testProcessCreationFormHasErrors() throws Exception {
72+
mockMvc.perform(post("/owners/{ownerId}/pets/{petId}/edit", TEST_OWNER_ID, TEST_PET_ID)
73+
.param("name", "Betty")
74+
.param("birthDate", "2015/02/12")
75+
)
76+
.andExpect(model().attributeHasNoErrors("owner"))
77+
.andExpect(model().attributeHasErrors("pet"))
78+
.andExpect(status().isOk())
79+
.andExpect(view().name("pets/createOrUpdatePetForm"));
80+
}
81+
82+
@Test
83+
public void testInitUpdateForm() throws Exception {
84+
mockMvc.perform(get("/owners/{ownerId}/pets/{petId}/edit", TEST_OWNER_ID, TEST_PET_ID))
85+
.andExpect(status().isOk())
86+
.andExpect(model().attributeExists("pet"))
87+
.andExpect(view().name("pets/createOrUpdatePetForm"));
88+
}
89+
90+
@Test
91+
public void testProcessUpdateFormSuccess() throws Exception {
92+
mockMvc.perform(post("/owners/{ownerId}/pets/{petId}/edit", TEST_OWNER_ID, TEST_PET_ID)
93+
.param("name", "Betty")
94+
.param("type", "hamster")
95+
.param("birthDate", "2015/02/12")
96+
)
97+
.andExpect(status().is3xxRedirection())
98+
.andExpect(view().name("redirect:/owners/{ownerId}"));
99+
}
100+
101+
@Test
102+
public void testProcessUpdateFormHasErrors() throws Exception {
103+
mockMvc.perform(post("/owners/{ownerId}/pets/{petId}/edit", TEST_OWNER_ID, TEST_PET_ID)
104+
.param("name", "Betty")
105+
.param("birthDate", "2015/02/12")
106+
)
107+
.andExpect(model().attributeHasNoErrors("owner"))
108+
.andExpect(model().attributeHasErrors("pet"))
109+
.andExpect(status().isOk())
110+
.andExpect(view().name("pets/createOrUpdatePetForm"));
111+
}
112+
113+
}

0 commit comments

Comments
 (0)