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)