微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot @WebMvcTest与@SpringBootTest

如何解决Spring Boot @WebMvcTest与@SpringBootTest

我有一个简单的健康控制器,定义如下:

@RestController
@RequestMapping("/admin")
public class AdminController {

    @Value("${spring.application.name}")
    String serviceName;

    @GetMapping("/health")
    String getHealth() {
        return serviceName + " up and running";
    }
}

以及要测试它的测试类:

@WebMvcTest(RedisController.class)
class AdminControllerTest {

    @Autowired
    private mockmvc mockmvc;

    @Test
    public void healthShouldReturnDefaultMessage() throws Exception {
        this.mockmvc.perform(get("/admin/health"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string(containsstring("live-data-service up and running")));
    }
}

运行测试时,出现以下错误

***************************
APPLICATION Failed TO START
***************************

Description:

Field configuration in com.XXXX.LiveDataServiceApplication required a bean of type 'com.XXXXX.AppConfiguration' that Could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.XXXX.AppConfiguration' in your configuration.

AppConfiguration.java中定义了与主Spring Boot应用程序类相同的包:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class AppConfiguration {

    @Value("${redis.host}")
    private String redisHost;

    @Value("${redis.port}")
    private int redisPort;

    @Value("${redis.password:}")
    private String redisPassword;
...
// getters and setters come here

主类:

@SpringBootApplication
public class LiveDataServiceApplication {

    @Autowired
    private AppConfiguration configuration;

    public static void main(String[] args) {
        SpringApplication.run(LiveDataServiceApplication.class,args);
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration(configuration.getRedisHost(),configuration.getRedisPort());
        redisConfiguration.setPassword(configuration.getRedisPassword());
        return new LettuceConnectionFactory(redisConfiguration);
    }
}

如果我按如下所示修改测试类中的注释,则测试通过:

@SpringBoottest
@AutoConfiguremockmvc
class AdminControllerTest {
....

我想念什么?

解决方法

您应该了解@WebMvcTest@SpringBootTest的用法

@WebMvcTest:注释仅用于实例化Web层而不是整个上下文,因此应该模拟控制器类中的所有依赖关系,您可以查看documentation >

Spring Boot仅实例化Web层,而不实例化整个上下文。在具有多个控制器的应用程序中,甚至可以通过使用@WebMvcTest(HomeController.class).

来仅请求实例化一个。

我们使用@MockBean为GreetingService创建并注入一个模拟(如果您不这样做,则应用程序上下文无法启动)

SpringBootTest::Spring Boot测试注释实际加载了测试环境的应用程序上下文

@SpringBootTest批注告诉Spring Boot查找一个主要配置类(例如,一个带有@SpringBootApplication的类),并使用该类来启动Spring应用程序上下文。

,

在src / test / resource / application.file中定义所有属性 将junit 5用于其余层的示例:

@ExtendWith(MockitoExtension.class)
public class RestTest {

    
    @InjectMocks
    private RestClass  restClass;
    
    
    
    private MockMvc mockMvc;
    
    @BeforeEach
    public void init() throws Exception {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(restClass).build();
    }
    
    @Test
    public void test() throws Exception {
        String url = "/url";
        ResultActions resultActions = mockMvc.perform(get(url));
        resultActions.andExpect(status().isOk());

    }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。