・ Spring Framework Anfänger ・ Junit Anfänger ・ Ich möchte den Controller des Spring Frameworks mit Junit testen! !! !!
・ Federrahmen 4.1.6 ・ Junit 4.1.2 ・ Servlet 3.1.0 ・ Hamcrest 2.2 ・ Momo c und 3.3.3.
//Hauptschicht
src.main.java
|
+--- jp.co.demo
+--- controller
+--- dto
+--- form
+--- entity
+--- mapper
+--- service
//Testschicht
src.test.java
|
+--- jp.co.demo
| +--- controller
|
src.test.resources
|
+--- META-INF
| |
| +--- sql
| |
| +--- insert_data.sql //SQL zum Erstellen von Testdaten
|
+--- spring
|
+--- mvc-config.xml //Bean-Definitionsdatei
insert_data.sql
DELETE FROM messages;
DELETE FROM users;
INSERT INTO users(id,account,password,name,branch_id,department_id) VALUES (1,'testuser','$2a$10$i0FlsKe6FiEuViMhclA90uCjCCKeLhtcswz01Rwl9qTIsIY1c.ohO','ALH Taro',1,1);
ALTER TABLE messages MODIFY id int not null; --Temporäres Zurücksetzen des automatischen Inkrements auf Zurücksetzen des automatischen Inkrements
ALTER TABLE messages AUTO_INCREMENT = 1; --Auto Inkrement Reset
ALTER TABLE messages MODIFY id int not null auto_increment; --Auto Inkrement Grant
INSERT INTO messages(title,text,category,user_id, created_date)VALUES('Titel','Text','Kategorie',1,'2020-05-27 01:02:03'); --3
INSERT INTO messages(title,text,category,user_id, created_date)VALUES('Titel','Text','Kategorie',1,'2020-05-28 02:03:04'); --4
INSERT INTO messages(title,text,category,user_id, created_date)VALUES('Titel','Text','Kategorie',1,'2020-05-23 03:04:05'); --1
INSERT INTO messages(title,text,category,user_id, created_date)VALUES('Titel','Text','Kategorie',1,'2020-05-24 04:05:06'); --2
INSERT INTO messages(title,text,category,user_id, created_date)VALUES('Titel','Text','Kategorie',1,'2020-05-29 05:06:07'); --5
DemoControllerTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration //Gebrauchsfertiger Kontext
@ContextConfiguration(locations = "classpath:spring/mvc-config.xml") //Geben Sie an, welche Bean-Definitionsdatei verwendet werden soll
@Transactional //Nach dem Test für Rollback definiert
public class DemoControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac; //Kontext vorbereiten
@Autowired
private JdbcTemplate jdbcTemplate;
@Before
public void setUp() {
executeScript("/META-INF/sql/insert_data.sql"); //SQL-Ausführung
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void test_1 Startbildschirm() throws Exception {
MvcResult mvcResult = mockMvc.perform(get("/home")) //Verhalten der GET-Kommunikation mit perform
.andDo(print()) //Auf Konsole drucken
.andExpect(status().isOk()) //Überprüfen Sie den Statuscode
.andExpect(view().name("home")) //Stimmt die Ansicht überein?
.andExpect(model().attributeExists("allUserMessage")) //Überprüfen Sie, ob das Zielmodell vorhanden ist
.andExpect(model().attributeExists("userComment")) //Überprüfen Sie, ob das Zielmodell vorhanden ist
.andExpect(model().attributeExists("deleteCommentForm")) //Überprüfen Sie, ob das Zielmodell vorhanden ist
.andExpect(model().attributeExists("commentForm")) //Überprüfen Sie, ob das Zielmodell vorhanden ist
.andExpect(model().attributeExists("userMessageForm")) //Überprüfen Sie, ob das Zielmodell vorhanden ist
.andReturn(); //Geben Sie das Ergebnis an mvcResult zurück
ModelAndView mav = mvcResult.getModelAndView();
int[] expectMessageIdList = { 5, 2, 1, 4, 3 }; //Zur Bestätigung der aufsteigenden Bestellung
@SuppressWarnings(value = "unchecked")
List<UserMessageForm> actualMessageList = ((List<UserMessageForm>) mav.getModel().get("allUserMessage"));
int expectMessageListSize = 5;
assertEquals(expectMessageListSize, actualMessageList.size()); //Stimmen die erstellten Daten mit der Listengröße des angezeigten Modells überein?
for (int i = 0; i < 5; i++) {
assertEquals(expectMessageIdList[i], actualMessageList.get(i).getId()); //Ist der Nachrichteninhalt in aufsteigender Reihenfolge?
}
}
@Test
public void test_2_1 Kann der Anmeldebildschirm angezeigt werden?() throws Exception {
mockMvc.perform(get("/login"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(model().attributeExists("loginForm"));
}
@Test
public void test_2_2 Können Sie sich anmelden?() throws Exception {
LoginForm loginForm = new LoginForm();
loginForm.setAccount("testuser");
loginForm.setPassword("password");
mockMvc.perform(post("/login").flashAttr("loginForm", loginForm))
.andDo(print())
.andExpect(view().name("redirect:/home")) //Übergangsziel bei erfolgreicher Anmeldung
.andExpect(status().isFound());
}
@Test
public void test_2_3 Wenn das Passwort falsch ist, wird ein Fehler ausgegeben und der Anmeldebildschirm angezeigt.() throws Exception {
LoginForm loginForm = new LoginForm();
loginForm.setAccount("testuser");
loginForm.setPassword("Falsches Passwort");
MvcResult mvcResult = mockMvc.perform(post("/login")
.flashAttr("loginForm", loginForm))
.andDo(print())
.andExpect(view().name("login"))
.andExpect(status().isOk())
.andExpect(model().attributeHasErrors("loginForm")) //Gibt es einen Fehler im Modell?
.andReturn();
ModelAndView mav = mvcResult.getModelAndView();
BindingResult result = (BindingResult) mav.getModel()
.get("org.springframework.validation.BindingResult.loginForm");
String actualErrorMessage = result.getFieldError("account").getDefaultMessage();
String expectErrorMessage = "Falsche Login-ID oder Passwort";
assertThat(expectErrorMessage, is(actualErrorMessage)); //Überprüfen Sie die Fehlermeldung
}
@Test
public void test_2_4 Wenn Sie versuchen, sich mit einem nicht vorhandenen Konto anzumelden, wird ein Fehler auf dem Bildschirm ausgegeben und der Anmeldebildschirm angezeigt.() throws Exception {
LoginForm loginForm = new LoginForm();
loginForm.setAccount("Nicht vorhandenes Konto");
loginForm.setPassword("password");
MvcResult mvcResult = mockMvc.perform(post("/login")
.flashAttr("loginForm", loginForm))
.andDo(print())
.andExpect(status().isOk())
.andExpect(model().attributeHasErrors("loginForm")) //Gibt es einen Fehler im Modell?
.andReturn();
ModelAndView mav = mvcResult.getModelAndView();
BindingResult result = (BindingResult) mav.getModel()
.get("org.springframework.validation.BindingResult.loginForm");
String actualErrorMessage = result.getFieldError("account").getDefaultMessage();
String expectErrorMessage = "Konto existiert nicht";
assertThat(expectErrorMessage, is(actualErrorMessage)); //Überprüfen Sie die Fehlermeldung
}
public void executeScript(String file) {
Resource resource = new ClassPathResource(file, getClass());
ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();
rdp.addScript(resource);
rdp.setSqlScriptEncoding("UTF-8");
rdp.setIgnoreFailedDrops(true);
rdp.setContinueOnError(false);
Connection conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
rdp.populate(conn);
}
}
Es handelt sich lediglich um einen Komponententest des Controllers, und es wird nicht berücksichtigt, das Rendering-Ergebnis auf der Ansichtsseite zu erfassen und zu testen (und es wird kein Anmeldefilter usw. angewendet). Es scheint, dass Sie das Rendering-Ergebnis mit HtmlUnit erhalten können, daher werde ich es zu einem anderen Zeitpunkt in Qiita auflisten.
Testdatenverwaltung mit Java + Spring (3) [SpringBoot] So schreiben Sie einen Controller-Test Offizielles Dokument für den Frühlingstest
Recommended Posts