繁体   English   中英

Spring 测试注解

[英]Spring testing annotations

我最近一直在做一个个人项目,看着我​​的测试文件,我意识到我有一些关于 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;
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM