【发布时间】:2014-11-03 19:17:24
【问题描述】:
我试图通过抛出异常来模拟我的 JUnit 测试中的失败情况。但是,我似乎无法正确地存根某些方法。
我的代码如下:
private MyClass mockObject;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockObject = PowerMockito.mock(MyClass.class);
whenNew(MyClass.class).withAnyArguments().thenReturn(mockObject);
}
@Test
public void testFailure() throws Exception {
PowerMockito.doThrow(new Exception("This is a test exception.")).when(mockObject).register(anyString());
...
}
,其中register的返回类型为void。
但是,当我执行这个测试时,我在doThrow 调用中得到一个未完成的存根异常。
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36)
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!
任何人都可以帮助确定我在这里缺少什么吗?
如果有帮助,我的 pom 中的 powermock-api-mockito 和 powermock-module-junit4 的依赖版本都是 1.5.6。
【问题讨论】:
-
看起来不错,你
@PrepareForTest(ClassUnderTest.class)吗?你的注册方法是最终的吗?还是 MyClass 决赛? -
是的,我确实使用
PrepareForTest(ClassUnderTest.class)注释了该类,其中 MyClass 的新实例正在构造函数中创建。至于最终,方法和类都不是最终的。 -
如果您的类是在构造函数中创建的,那么您的 CLassUnderTest 相对于测试用例中的 whenNew 调用在哪里创建?
-
它实际上是在我的测试方法中的 doThrow 调用之后,但我在示例中省略了它。就像这样:
ClassUnderTest helper = new ClassUnderTest();。测试方法只包含这两行。 -
问题出在与此代码无关的静态模拟上。我在@BeforeClass 方法中有
mockStatic(AnotherClass.class); doNothing().when(AnotherClass.class);。删除 doNothing() 行后,测试工作正常。感谢您的帮助..
标签: java unit-testing junit powermock