【问题标题】:How to mock Optional bean in spring boot?如何在 Spring Boot 中模拟 Optional bean?
【发布时间】:2020-02-25 18:43:03
【问题描述】:

在我的SpringBootApplication 中,我有一个bean,它注入了另一个可选的bean(如下所示)

@Service
public class A {

    //B is another @Component from one of the dependencies
    private Optional<B> b;
    ...
    ...
}

我正在为 class A 编写集成测试,我需要 @MockBean Optional&lt;B&gt; b。然而,由于Optional 是最后一个类,spring mockito 会引发以下错误

不能模拟/监视类 java.util.Optional - 最后一课

有没有办法解决这个问题?非常感谢任何帮助。

【问题讨论】:

  • 我真的很好奇为什么将Optional 与组件放在一起。因为 Spring 总是会实例化 B 组件,所以 Optional 在这里没有意义,因为 Optional 的想法是处理可能的 NullEmpty 值,在这种情况下它永远不会为空。跨度>
  • 据我了解,它是@Autowired(required = false)的替代品
  • 我理解你的观点。虽然,只要我们可以,我们应该让 spring 处理它。

标签: java spring spring-boot mockito springmockito


【解决方案1】:

您可以使用Optional.of(b)

如果您将 mockito 与注释一起使用,则不能使用 @InjectMocks,因为您的 optional 不会因 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));
    }
}

【讨论】:

  • 这可行,但我选择不修改生产代码以使测试正常工作。不管怎么说,还是要谢谢你。我选择改用@Autowired(required = false)
【解决方案2】:

您实际上应该使用 @MockBean@MockBeansTestConfig 类模拟实际的 bean,并使用模拟的 bean 自动装配 Optional

@Autowired
private Optional<B> OptionalB;

@MockBean
private B b;

【讨论】:

  • 这在技术上应该可行,但是我无法注入 bean。我已经退回到@Autowired(required = false)
【解决方案3】:

虽然Lino'sabove答案完美运行,但我选择不修改生产代码以使测试正常工作。相反,我修改了我的代码,如下所示:

@Service
public class A {

    @Autowired(required = false)
    private B b;
    ...
    ...
}

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2016-12-09
    • 2019-01-30
    • 2019-06-06
    相关资源
    最近更新 更多