用于 Spring Boot + Thymeleaf 的 @WebAppConfiguration 和 @ContextConfiguration

Posted

技术标签:

【中文标题】用于 Spring Boot + Thymeleaf 的 @WebAppConfiguration 和 @ContextConfiguration【英文标题】:@WebAppConfiguration and @ContextConfiguration for Spring Boot + Thymeleaf 【发布时间】:2016-04-08 23:41:24 【问题描述】:

给定一个 Spring Boot + Thymeleaf Web 应用程序(这与 Spring 项目的 gs-consuming-rest "initial" code tree 几乎相同):

├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── hello
    │   │       ├── Application.java
    │   │       ├── Config.java
    │   │       └── Controller.java
    │   └── resources
    │       └── templates
    │           └── index.html
    └── test
        └── java
            └── hello
                └── ControllerTest.java

...用户会收到“Hello World!”的问候。 http://localhost:8080/,但 Spring 的“上下文”的布线似乎不适用于集成测试 (ControllerTest.java):

java.lang.AssertionError: Status 
Expected :200
Actual   :404

测试中的项目布局和/或配置注释有什么问题?

src/main/webapp/ 以及 web.xmlWEB-INF/ 之类的东西是故意丢失的。这里的目标是使用最少的配置,通过集成测试来测试应用程序的视图和控制器的开发。

下面的血腥细节。提前为“文字墙”道歉。


pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.1.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

Application.java

package hello;

// ...

@SpringBootApplication
public class Application 

  public static void main(String[] args) throws Throwable 
    SpringApplication.run(Application.class, args);
  

Controller.java

package hello;

@org.springframework.stereotype.Controller
public class Controller 

Config.java

package hello;

// ...

@Configuration
public class Config extends WebMvcConfigurerAdapter 

  @Override
  public void addViewControllers(ViewControllerRegistry registry) 
    registry.addViewController("/").setViewName("index");
  

ControllerTest.java

package hello;

// ...

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = Config.class)
public class ControllerTest 

  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Before
  public void setup() 
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
  

  @Test
  public void test() throws Exception 
    this.mockMvc
        .perform(get("/"))
        .andExpect(status().isOk());
  

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Hello World!</title>
  </head>
  <body>
    <p>Hello world!</p>
  </body>
</html>

【问题讨论】:

您不应该使用@ContextConfiguration,而是使用@ SpringApplicationConfiguration,并将其指向您的应用程序类而不是配置类。 @M.Deinum 我使用@SpringApplicationConfiguration。如何使用不同的 @Configuration 类进行测试? 【参考方案1】:

感谢@M.Deinum 帮助我意识到这一点:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = Config.class)
public class ControllerTest 

...应该是:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes = Application.class)
public class ControllerTest 

我认为@ContextConfiguration 用于Spring 中的集成测试,而@SpringApplicationConfiguration 用于Spring Boot 中的集成测试。

根据Javadoc for the latter:

用于确定如何为集成测试加载和配置 ApplicationContext 的类级注释。

类似于标准的@ContextConfiguration,但使用了 Spring Boot 的 SpringApplicationContextLoader。

【讨论】:

@SpringApplicationConfiguration 已被弃用,取而代之的是其他东西:***.com/questions/39417530/… 我面临同样的问题,但我正在使用@SpringBootTest...知道如何解决【参考方案2】:
    package com.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import netgloo.Application;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class SmokeTest 


    @Test
    public void contexLoads() throws Exception 
     System.out.println("Test");
    

【讨论】:

这会加载要在 TestClass 中使用的应用程序的整个上下文

以上是关于用于 Spring Boot + Thymeleaf 的 @WebAppConfiguration 和 @ContextConfiguration的主要内容,如果未能解决你的问题,请参考以下文章

Lombok 不适用于 spring-boot-maven

定制的 ObjectMapper 不适用于 spring boot hatoas

JSF 注释不适用于 Spring-boot

Spring-Boot 不适用于 Flyway

Thymeleaf 3 URL 解析不适​​用于 Spring Boot 4 + Spring Security

跨域不适用于 Spring Boot