0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【spring-mvc + Thymeleaf】 JUnit の設定

Last updated at Posted at 2020-09-20

はじめに

spring プロジェクトで、JUnit を使用する際に、最低限必要な設定のまとめです。
本記事は、

の続きです。

設定手順

pom.xml

ライブラリの依存関係を設定します。

pom.xml
pom.xml
  (...)
  <dependencies>
    (...)
  	<!-- #4 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-test</artifactId>
  		<version>${org.springframework.version}</version>
  		<scope>test</scope>
  	</dependency>
  	<!-- #5 -->
  	<dependency>
  		<groupId>org.junit.jupiter</groupId>
  		<artifactId>junit-jupiter</artifactId>
  		<version>5.5.2</version>
  		<scope>test</scope>
  	</dependency>
  	<!-- #6 -->
  	<dependency>
  		<groupId>org.hamcrest</groupId>
  		<artifactId>hamcrest</artifactId>
  		<version>2.1</version>
  		<scope>test</scope>
  	</dependency>
  	<!-- #7 -->
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>javax.servlet-api</artifactId>
  		<version>3.1.0</version>
  		<scope>provided</scope>
  	</dependency>
  	<!-- #8 -->
    <dependency>
    	<groupId>org.mockito</groupId>
    	<artifactId>mockito-junit-jupiter</artifactId>
    	<version>3.5.11</version>
    	<scope>test</scope>
    </dependency>
  	<!-- #9 -->
    <dependency>
    	<groupId>org.jmockit</groupId>
    	<artifactId>jmockit</artifactId>
    	<version>1.49</version>
    	<scope>test</scope>
    </dependency>
  </dependencies>
  (...)

spring-test

依存関係

No. groupId artifactId version scope
4 org.springframework spring-test ${org.springframework.version} test
5 org.junit.jupiter junit-jupiter 5.5.2 test
6 org.hamcrest hamcrest 2.1 test
7 javax.servlet javax.servlet-api 3.1.0 provided

メモ

  • hamcrest (#6) が無いと、view() はビルドエラーになります。
  • javax.servlet-api (#7) は、無くてもビルドできるが、JUnit実行時に以下のエラーが発生します。
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.test.context.web.WebDelegatingSmartContextLoader]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext
(...)

テストコード

controller のテストコードを追加します。

HomeControllerTest.java
src/test/java/com/example/demo/app/welcome/HomeControllerTest.java
package com.example.demo.app.welcome;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@SpringJUnitWebConfig(locations = "file:src/main/webapp/WEB-INF/spring/dispatcher-config.xml")
public class HomeControllerTest {

	private MockMvc mockMvc;

	@Autowired
	private WebApplicationContext wac; //コンテキストを用意

	@BeforeEach
	public void setUp() {
		mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
	}

	@Test
	public void testHomeController() throws Exception {
		final ResultActions result = mockMvc.perform(get("/"));
		result.andExpect(status().isOk());
		result.andExpect(view().name("welcome/home"));
	}
}

spring-test + mockito

依存関係

No. groupId artifactId version scope
8 org.mockito mockito-junit-jupiter 3.5.11 test

メモ

  • junit5mockito を使用する場合は、mockito-junit-jupiter (#8) があります。
  • mockito-junit-jupiter (#8) を使用する場合は、junit-jupiter (#5) は不要です。

テストコード

controller のテストコードを追加します。

HomeControllerTestWithMockito.java
src/test/java/com/example/demo/app/welcome/HomeControllerTestWithMockito.java
package com.example.demo.app.welcome;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;	// mockito
import org.mockito.junit.jupiter.MockitoExtension;	// mockito
import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

@ExtendWith(MockitoExtension.class)	// mockito
@SpringJUnitWebConfig(locations = "file:src/main/webapp/WEB-INF/spring/dispatcher-config.xml")
public class HomeControllerTestWithMockito {

	private MockMvc mockMvc;

	@InjectMocks	// mockito
	HomeController homeController;

	@BeforeEach
	public void setUp() {
		mockMvc = MockMvcBuilders.standaloneSetup(homeController).build();
	}

	@Test
	public void testHomeController() throws Exception {
		final ResultActions result = mockMvc.perform(get("/"));
		result.andExpect(status().isOk());
		result.andExpect(view().name("welcome/home"));
	}
}

spring-test + jmockit

依存関係

No. groupId artifactId version scope
9 org.jmockit jmockit 1.49 test

テストコード

controller のテストコードを追加します。

HomeControllerTestWithJMockit.java
src/test/java/com/example/demo/app/welcome/HomeControllerTestWithJMockit.java
package com.example.demo.app.welcome;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import mockit.Tested;	// jmockit

@SpringJUnitWebConfig(locations = "file:src/main/webapp/WEB-INF/spring/dispatcher-config.xml")
public class HomeControllerTestWithJMockit {

	private MockMvc mockMvc;

	@Tested(availableDuringSetup=true)	// jmockit
	HomeController homeController;

	@BeforeEach
	public void setUp() {
		mockMvc = MockMvcBuilders.standaloneSetup(homeController).build();
	}

	@Test
	public void testHomeController() throws Exception {
		final ResultActions result = mockMvc.perform(get("/"));
		result.andExpect(status().isOk());
		result.andExpect(view().name("welcome/home"));
	}
}

ソース一式

ソース一式は以下の場所にあります。

参考にしたサイト

以上

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?