我最近一直在从事一个个人项目,查看我的测试文件,我意识到我有一些关于 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
语句,这是一个独立的测试(没有服务器,也没有应用程序上下文)。
我的问题是:
- 这些元素不兼容吗?
- 一个元素混淆了另一个元素?这是:通过使用
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/