【发布时间】:2021-06-05 17:14:20
【问题描述】:
我有一个如下的 Java 类
public class MyClass {
private final ShowFactory showFactory;
private SomeShow someShow;
public MyClass(ShowFactory showFactory) {
this.showFactory = showFactory;
startShow();
}
public void startShow() {
someShow = showFactory.createShow();
someShow.start();
}
public void showSomething() {
MagicBox magicBox = new MagicBox();
someShow.showSomething(magicBox);
}
public void stopShow() {
someShow.stop();
}
}
并尝试测试showSomething 方法。完整的测试文件如下
public class MyClassTest {
private ShowFactory showFactory;
private SomeShow someShow;
@Before
public void setUp() {
showFactory = mock(ShowFactory.class);
someShow = mock(SomeShow.class);
when(showFactory.createShow()).thenReturn(someShow);
}
@Test
public void shouldStartShow() {
new MyClass(showFactory);
verify(someShow).start();
}
@Test
public void shouldShowSomething() throws Exception {
MagicBox magicBox = mock(MagicBox.class);
PowerMockito.whenNew(MagicBox.class).withAnyArguments().thenReturn(magicBox);
doNothing().when(someShow).showSomething(magicBox);
InOrder inOrder = inOrder(someShow);
MyClass myClass = new MyClass(showFactory);
myClass.showSomething();
inOrder.verify(someShow).start();
inOrder.verify(someShow).showSomething(magicBox);
}
@Test
public void shouldStopShow() {
MyClass myClass = new MyClass(showFactory);
myClass.stopShow();
verify(someShow).start();
verify(someShow).stop();
}
}
但是测试 shouldShowSomething 失败并出现错误 Wanted but not invoked。我在这里缺少什么吗?有什么建议吗?
【问题讨论】:
-
我认为您需要更多步骤才能使用
PowerMockito.whenNew来模拟构造函数调用github.com/powermock/powermock/wiki/… 所以它需要使用PowerMockRunner 运行并使用带有正确类的@PrepareForTest。将方法的内部模拟到构造函数调用是非常深刻的。您是否可以交替使用匹配器来断言magicBox处于理想状态?喜欢inOrder.verify(someShow).showSomething(argThat(argument -> matchingLogicGoesHere));。
标签: java mocking mockito powermockito