[JAVA] Testen Sie den Spring Framework Controller mit Junit

Zielgruppe

・ Spring Framework Anfänger ・ Junit Anfänger ・ Ich möchte den Controller des Spring Frameworks mit Junit testen! !! !!

Projekt ver

・ Federrahmen 4.1.6 ・ Junit 4.1.2 ・ Servlet 3.1.0 ・ Hamcrest 2.2 ・ Momo c und 3.3.3.

Dateistruktur

//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

Prüfung

Ausführbare SQL-Datei

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

Controller-Test

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);
	}

}

Impressionen

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.

Verweise

Testdatenverwaltung mit Java + Spring (3) [SpringBoot] So schreiben Sie einen Controller-Test Offizielles Dokument für den Frühlingstest

Recommended Posts

Testen Sie den Spring Framework Controller mit Junit
Testen Sie den Controller mit Mock MVC im Spring Boot
Testen Sie die Web-API mit junit
[Spring] Controller-Ausnahmeausgabetest
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
[JUnit 5] Schreiben Sie einen Validierungstest mit Spring Boot! [Parametrisierungstest]
Ich habe jetzt einen Test mit Spring Boot + JUnit 5 geschrieben
[Java] Testen Sie private Methoden mit JUnit
Beispielcode zum Testen eines Spring Boot-Controllers mit MockMvc
Führen Sie einen Transaktionsbestätigungstest mit Spring Boot durch
Der JUnit 5-Gradle-Test führt zu einem Fehler mit der Lombok-Annotation
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
Formularklassenvalidierungstest mit Spring Boot
[Java] So testen Sie, ob es in JUnit null ist
[CircleCI 2.0] [Java] [Maven] [JUnit] Aggregieren Sie die JUnit-Testergebnisse mit CircleCI 2.0
So testen Sie Interrupts während Thread.sleep mit JUnit
Einfacher JUnit-Test der Elasticsearch 2018-Version mit Embedded-Elasticsearch
[Java] Hallo Welt mit Java 14 x Spring Boot 2.3 x JUnit 5 ~
Testcode mit Mock mit JUnit (EasyMock Center)
Machen Sie System.out Mock mit dem Spock Test Framework
Mischen Sie Testfälle mit JUnit 5 und Standardmethoden
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
[Spring Framework] Konfigurationsaufteilung
Mehrsprachige Unterstützung für Spring Framework
Integrationstest mit Gradle
1. Starten Sie Spring Framework von 1
Spring Framework Zusammenfassung - Über DI
Feder mit Kotorin --5 Aktuator
Testen Sie den Inhalt einer Excel-Datei mit JUnit
[Schienen] Test mit RSpec
Web-API-Komponententest und Integrationstest mit SpringBoot + Junit5, 4 Muster
Selbstgemachte Validierung mit Spring
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Automatisch mit Messgerät testen
Lasttest mit JMeter
Frühling mit Kotorin ―― 1. SPRING INITIALIZR
Mit Spring Boot herunterladen
MOCKEN Sie die Konstruktoren anderer Klassen mit Spring MVC + PowerMock + Junit
Erstellen Sie eine Hello World-Webanwendung mit Spring Framework + Jetty
Verwenden Sie Spring Test + Mockito + JUnit 4 für Spring Boot + Spring Retry Unit Test
[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen
Einfacher Mikroservice mit Spark Framework!
[Persönliche Notizen] Über das Spring Framework
[Java] JUnit4-Testfallbeispiel
Hallo Welt mit Spring Boot
Java-Konfiguration mit Spring MVC
JUnit 5 schlägt mit java.lang.NoSuchMethodError fehl: org.junit.platform.launcher.Launcher.execute
Implementieren Sie GraphQL mit Spring Boot
Frühling mit Kotorin --- 8. Aufbewahrungsschicht
Spring Framework Selbststudium Memo series_1
Informationen zum Spring Framework-Kontextfehler
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Feder mit Kotorin --6 Asynchrone Verarbeitung
Testen Sie Active Strage mit RSpec
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Spring Model View Controller Flow
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Feder mit Kotorin ―― 7. Serviceschicht