Java 如何在spring boot中模拟可选bean?
在我的Java 如何在spring boot中模拟可选bean?,java,spring,spring-boot,mockito,springmockito,Java,Spring,Spring Boot,Mockito,Springmockito,在我的springbootplication中,我有一个bean,它注入了另一个可选bean(如下所示) @服务 公共A类{ //B是其中一个依赖项中的另一个@组件 私人可选b; ... ... } 我正在为类A编写一个集成测试,其中我需要@MockBean可选b。然而,由于Optional是最后一个类,spring mockito会引发以下错误 无法模拟/间谍类java.util.Optional -期末班 有办法解决这个问题吗?非常感谢您的帮助。您可以使用可选。of(b) 如果将mocki
springbootplication
中,我有一个bean
,它注入了另一个可选bean(如下所示)
@服务
公共A类{
//B是其中一个依赖项中的另一个@组件
私人可选b;
...
...
}
我正在为类A
编写一个集成测试,其中我需要@MockBean
可选b
。然而,由于Optional
是最后一个类,spring mockito会引发以下错误
无法模拟/间谍类java.util.Optional
-期末班
有办法解决这个问题吗?非常感谢您的帮助。您可以使用
可选。of(b)
如果将mockito与注释一起使用,则不能使用@InjectMocks
,因为mockito不知道您的可选选项。您必须自己创建服务A
。大概是这样的:
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
private B b;
private A a;
@Before
public void setup() {
a = new A(Optional.of(b));
}
}
您应该实际使用
@MockBean
或@MockBean
或TestConfig
类模拟实际bean,并使用模拟bean自动连接可选
@Autowired
private Optional<B> OptionalB;
@MockBean
private B b;
@Autowired
私人可选B;
@蚕豆
私人B,;
虽然answer工作得很好,但我选择不修改生产代码以使测试正常工作。我修改了我的代码,如下所示:
@服务
公共A类{
@自动连线(必需=错误)
私人B,;
...
...
}
我真的很好奇为什么要把可选的
和一个组件放在一起。因为Spring总是会实例化B
组件,所以可选在这里没有意义,因为可选的想法是处理可能的Null
或Empty
值,在这种情况下它永远不会为空。据我所知,它是@Autowired(required=false)的替代品我理解你的观点。虽然,只要我们可以,我们应该让spring来处理它。这在技术上应该是有效的,但是我不能让bean注射。我已经退回到@Autowired(required=false),这是可行的,但我选择不修改生产代码以使测试工作。无论如何,谢谢你。我选择使用@Autowired(required=false)