java - Spring测试注解

标签 java spring spring-boot

我最近一直在从事一个个人项目,查看我的测试文件,我意识到我有一些关于 spring 注释的内容:

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class BookingServicesTests {

    private MockMvc mvc;

    @Mock
    private BookingRepository bookingRepository;

    @InjectMocks
    private BookingResource bookingController;

    @Before
    public void setup() {
        JacksonTester.initFields(this, new ObjectMapper());
        mvc = MockMvcBuilders
                .standaloneSetup(bookingController)
                .setControllerAdvice(new ConflictExceptionController())
                .build();
    }

   ...
}

所以,@SpringBootTest 是为了使用真正的 HTTP 方法来测试您的应用程序。但在我的 setup 方法中,我包含了一个 MockMvcBuilders 语句,这是一个独立的测试(没有服务器,也没有应用程序上下文)。

我的问题是:

  1. 这些元素不兼容吗?
  2. 一个元素混淆了另一个元素?这是:通过使用MockMvcBuilder我可以摆脱@SpringBootTest吗?

谢谢

最佳答案

使用其中之一,而不是同时使用两者。只允许使用一个 JUnit 的 @runwith(),并且您传入的值,无论是 SpringRunner.class 还是 MockitoJUnitRunner.class,都具有非常不同的行为。

因此,您发布的代码不正确,因为当您的测试类“使用 MockitoJUnitRunner 运行”时,@SpringBootTest 将尝试加载应用程序上下文。因此,@SpringBootTest 应与 @runWith(SpringRunner.class) 一起使用

@RunWith(SpringRunner.class)
@WebMvcTest(BookingResource.class) // multiple controller class could go here
@AutoConfigureMockMvc
public class BookingServicesTests {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private BookingRepository bookingRepository;

    ...
}

请注意我如何将 @SpringBootTest() 替换为 @WebMvcTest()。这是因为 @WebMvcTest() 只扫描 @Controller 组件并加载 Web 层的配置,而 @SpringBootTest() 则这样做对于整个应用程序。

或者你在没有 Spring 的情况下使用 Mockito 做了什么:

@RunWith(MockitoJUnitRunner.class)
public class BookingServicesTests {

    private MockMvc mvc;

    @Mock
    private BookingRepository bookingRepository;

    @InjectMocks
    private BookingResource bookingController;
    ...
}

关于java - Spring测试注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298948/

相关文章:

java - 在表单 {} 中将数组作为参数传递

java - 如何使用 spring 'ResourcePatternResolver' 从指定路径读取所有文件

java - spring jpa 可分页排序 PropertyReferenceException

java - Spring Security 从无状态服务器注销

java - 应用程序无法使用 @Async 注释启动

spring-boot - Spring Boot 3升级后找不到changelog目录

java - Java 中的时区不匹配

java - Akka BalancingDispatcher 配置

spring-boot - 在 Spring-Boot 应用程序中使用 application.yaml 配置 hystrix 命令属性

java - 有什么方法可以使用 Java NIO/选择器获得读取超时吗?