【发布时间】:2019-12-10 08:49:12
【问题描述】:
我必须在我的 Java 应用程序中实现 MyUtility.class 的单元测试。但是,它依赖于MyConfig.class(它从application.yml 文件中获取配置属性)。
class MyUtility {
MyConfig myConfig;
@Autowired
public MyUtility(MyConfig myConfig) {
this.myConfig = myConfig;
}
public String methodA() {
... // use myConfig.getValue() to perform some operation
methodB(); // call methodB()
...
}
public String methodB() { ... }
}
@Component
@ConfigurationProperties(prefix = "test")
class MyConfig {
String value; // to map test.value from application.yml
}
使用 JUnit5,我正在尝试测试功能 methodA。但是,我不需要测试 methodB 。因此,我在嘲笑methodB 的回复。
class ApplicationTests {
@Mock
MyConfig myConfig;
@Mock
MyUtility myUtility;
...
@Test
public void testMethodA() {
Mockito.when(myUtility.methodB()).thenReturn("someValue");
...
}
}
由于我要模拟MyUtility,我还必须模拟MyConfig,因为它是一个依赖项(否则myConfig 显示为null)。但我不想嘲笑MyConfig。我希望methodA 使用application.yml 文件中存在的值,而不是模拟它。
是否可以将应用程序上下文中的MyConfig 注入MyUtility 模拟?
【问题讨论】:
-
嗨,你为什么要嘲笑你的
Utility班级?如果它是你正在测试的类,它不应该被嘲笑,对吧?看来您可能需要@Spy -
我正在尝试测试实用程序类的
methodA。但我不想测试由methodA在内部调用的methodB。methodB发出 Http 请求。我想模拟methodB的响应以避免网络调用,只是测试methodA的功能 -
但是没有办法在模拟中自动装配?因此,如果一个 mock 正在使用任何其他依赖项,我们也必须模拟它们?
-
如果您在模拟
MyUtility,则无需模拟MyConfig,因为实现不再重要。为什么要模拟该特定方法?似乎您在错误的级别上解决了这个问题。
标签: java spring-boot unit-testing mockito junit5