【发布时间】:2019-06-16 12:58:56
【问题描述】:
这是我的GitHub repo,用于重现确切的问题。
不确定这是 Spring Boot 问题还是 Mockito 问题。
我有以下 Spring Boot @Component 类:
@Component
class StartupListener implements ApplicationListener<ContextRefreshedEvent>, KernelConstants {
@Autowired
private Fizz fizz;
@Autowired
private Buzz buzz;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// Do stuff involving 'fizz' and 'buzz'
}
}
所以StartupListener 没有构造函数,并且故意是一个Spring @Component,它通过@Autowired 注入其属性。
提供这些依赖项的@Configuration 类在这里,很好衡量:
@Configuration
public class MyAppConfiguration {
@Bean
public Fizz fizz() {
return new Fizz("OF COURSE");
}
@Bean
public Buzz buzz() {
return new Buzz(1, true, Foo.Bar);
}
}
我现在正在尝试为 StartupListener 编写 JUnit 单元测试,并且我一直在使用 Mockito 并取得了巨大的成功。我想创建一个 mock Fizz 和 Buzz 实例并用它们注入 StartupListener,但我不确定如何:
public class StartupListenerTest {
private StartupListener startupListener;
@Mock
private Fizz fizz;
@Mock
price Buzz buzz;
@Test
public void on_startup_should_do_something() {
Mockito.when(fizz.calculateSomething()).thenReturn(43);
// Doesn't matter what I'm testing here, the point is I'd like 'fizz' and 'buzz' to be mockable mocks
// WITHOUT having to add setter methods to StartupListener and calling them from inside test code!
}
}
有什么想法可以做到这一点吗?
更新
请查看我的GitHub repo 以重现此确切问题。
【问题讨论】:
-
使用
@MockBean -
您是否遇到任何错误?什么对你不起作用?只是,您可能缺少
MockitoAnnotations.initMocks(this);或@RunWith(SpringJUnit4ClassRunner.class)。 -
感谢@SergeiSirik (+1),但是当我尝试从我的配置类中抛出一个 NPE 时(请参阅上面的更新,其中包括完整的源代码)。有任何想法吗?再次感谢!
-
另外@SergeiSirik 请查看我关于我将代码推送到的 GitHub 存储库的更新;它重现了我所看到的问题!提前感谢您的帮助!
标签: java unit-testing spring-boot junit mockito