gpt4 book ai didi

spring - @MockBeans 示例使用

转载 作者:行者123 更新时间:2023-12-04 22:54:31 28 4
gpt4 key购买 nike

我有一个使用多种服务的 Controller 类。我为该 Controller 编写了一个测试,例如:

@RunWith(SpringRunner.class)
@WebMvcTest(value = PurchaseController.class, secure = false)
public class PurchaseControllerTest {

@MockBean
private ShoppingService shoppingService;

@MockBean
private ShopRepository shopRepository;

@MockBean
private SomeOtherRepository someOtherRepository;

@Autowired
private MockMvc mockMvc;

// ... some tests goes here

问题是,往往会有很多这样的模拟,因此有很多行代码。我知道这可能是代码异味的迹象,但这不是我现在的重点。

我注意到还有一个 @MockBeans具有 @Target(ElementType.TYPE) 的注释.所以我想我可以试试:

@RunWith(SpringRunner.class)
@WebMvcTest(value = PurchaseController.class, secure = false)
@MockBeans(value = {ShoppingService.class, ShopRepository.class})
public class PurchaseControllerTest {

但它不会编译事件。

我的问题是:我们如何使用 @MockBeans注解?它适用于我的情况吗?

最佳答案

@MockBeans它只是 @MockBean 乘法的可重复注释s。如果您需要重用这个模拟 bean,您可以放入一个类/配置类。但是你需要使用@Autowired对于您要模拟什么的服务。所以在你的情况下应该是:

.....
@MockBeans({@MockBean(ShoppingService.class), MockBean(ShopRepository.class)})
public class PurchaseControllerTest {
@Autowired
ShoppingService shoppingService;
@Autowired
ShopRepository shopRepository;
.....
}
@MockBeans的主要思想它只是重复 @MockBean在一个地方。对我来说,它可能仅对您可以重用的某些配置/公共(public)类有用。
@MockBean - 创建一个模拟, @Autowired - 是从上下文中 Autowiring 的 bean,在你的情况下,它将 bean 标记/创建为模拟然后模拟的 bean 将被注入(inject)你的 Autowiring 字段中。

因此,如果您有很多带有 @MockBeans 的 Autowiring 字段(或乘以 @MockBean )您可以在一个地方配置它是否是模拟的(在 @MockBeans 中用于类级别)并且您不需要更改 @Autowired@Mock在您的测试类中(就像在您的情况下,如果您删除 @MockBeans 所有未模拟的 Autowiring bean 将作为来自上下文的 bean Autowiring ,并且如果您撤消删除,您将在模拟 bean 中工作(您在此注释中配置)) .

如果你想避免一个类中的大量依赖,你可以将所有依赖提取到某个父类中,但由于 java 不支持类的多重继承,它并不总是有帮助。

关于spring - @MockBeans 示例使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56132357/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com