如何在 spring 引导中模拟可选 bean?
How to mock Optional bean in spring boot?
在我的 SpringBootApplication
中,我有一个 bean
注入另一个可选 bean(如下所示)
@Service
public class A {
//B is another @Component from one of the dependencies
private Optional<B> b;
...
...
}
我正在为 class A
编写集成测试,我需要 @MockBean
Optional<B> b
。然而,由于 Optional
是最终的 class,spring mockito 引发以下错误
Cannot mock/spy class java.util.Optional
- final class
有办法解决这个问题吗?非常感谢任何帮助。
您可以使用 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
或 @MockBeans
或 TestConfig
class 模拟实际 bean,并使用模拟 bean [=15= 自动装配 Optional
]
@Autowired
private Optional<B> OptionalB;
@MockBean
private B b;
虽然 Lino's 答案完美无缺,但我选择不修改生产代码以使测试工作。我改为修改我的代码如下:
@Service
public class A {
@Autowired(required = false)
private B b;
...
...
}
在我的 SpringBootApplication
中,我有一个 bean
注入另一个可选 bean(如下所示)
@Service
public class A {
//B is another @Component from one of the dependencies
private Optional<B> b;
...
...
}
我正在为 class A
编写集成测试,我需要 @MockBean
Optional<B> b
。然而,由于 Optional
是最终的 class,spring mockito 引发以下错误
Cannot mock/spy class java.util.Optional - final class
有办法解决这个问题吗?非常感谢任何帮助。
您可以使用 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
或 @MockBeans
或 TestConfig
class 模拟实际 bean,并使用模拟 bean [=15= 自动装配 Optional
]
@Autowired
private Optional<B> OptionalB;
@MockBean
private B b;
虽然 Lino's
@Service
public class A {
@Autowired(required = false)
private B b;
...
...
}