春季测试注释

时间:2019-01-21 23:02:44

标签: java spring spring-boot

最近我一直在从事一个个人项目,看着我​​的测试文件,我发现我有一些关于弹簧注释的信息:

@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

谢谢

1 个答案:

答案 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;
    ...
}