java - [JUnit][Mockito] 如何验证方法在调用堆栈的另一层被调用?
问题描述
我有MyClass
一个OtherClass
字段:
public class MyClass
{
@Autowired
private OtherClass other;
public void foo() {
// Some interactions
other.bar(someParameter);
}
}
public class OtherClass
{
public void bar() {
// Some interactions
if (someConditionThatIsTrue) {
baz(someParam);
}
}
public void baz(SomeParamClass param) {
// Some interactions
}
}
对于测试MyClass
,我想检查OtherClass.baz()
从MyClass.foo()
. 这就是我所拥有的:
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@InjectMocks
private MyClass myClass;
@Mock
private OtherClass otherClass;
@Test
public void testFoo_whenFooIsCalled_shouldTriggerBaz() {
// Some setups
myClass.foo();
verify(otherClass, times(1)).baz(any());
}
}
上面的测试没有检测到OtherClass.baz()
,但检测到OtherClass.bar()
:
Wanted but not invoked: otherClass.baz( <any> ); -> at MyClassTest.testFoo_whenFooIsCalled_shouldTriggerBaz(MyClassTest.java:12) However, there were other interactions with this mock: otherClass.bar( "some parameter" ); -> at MyClass.foo(MyClass.java:7)
没有重构MyClass
,是否可以OtherClass.baz()
从测试中检测到实例?
解决方案
你只需要使用间谍
@Spy
private OtherClass otherClass;
但是,这不是一个好习惯。您正在测试两个不同的类。我只想确保您bar
在第一次测试中使用正确的参数进行调用。然后为OtherClass
.
推荐阅读
- angular - 交换 Nebular 主题时更改 Bootstrap 表格字体颜色
- powerapps - 将 2 个共享点列表的数据加载到电源应用程序中的单个库的任何功能?
- go - 使用等待组来完成 goroutine
- c# - 为什么操作符的行为类似于 == 操作符?
- c - 自定义读线功能
- visual-studio-code - 如何在 VS Code 中为单个变量启用类型注释
- javascript - 如何解决 onmouseover 事件中的过渡问题?
- android - iOS idfa 和 android 广告 id 是否彼此唯一?
- docker - 安装 docker 时证书验证失败
- ios - 如何立即将数据传送到 iPhone 应用程序?