最近我一直在从事一个个人项目,看着我的测试文件,我发现我有一些关于弹簧注释的信息:
@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
?谢谢
答案 0 :(得分:1)
使用一个或另一个,而不是两个都使用。仅允许您使用一个JUnit的@runwith()
,并且您传入的值(无论是SpringRunner.class
还是MockitoJUnitRunner.class
的行为都非常不同。
因此,您发布的代码不正确,因为当测试类“以@SpringBootTest
运行时,MockitoJUnitRunner
会尝试加载应用程序上下文。因此,@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;
...
}