我需要建立以下情況下的單元測試:被測模擬靜態默認接口方法
類別:
class MyProducer {
private Producer producer = null;
private ProducerCreator producerCreator = null;
public MyProducer() {
producerCreator = ProducerCreator.create(string name);
producer = producerCreator.createProducer();
}
public boolean foo() {
return producer.foo();
}
}
類ProducerCreator是從外部包沒有源代碼:
public interface ProducerCreator {
static default ProducerCreator create(String name) {
return new ProducerCreatorImpl(...)
}
}
所以我試圖嘲弄與PowerMockito的靜態調用:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ProducerCreator.class)
public class ProducerTest {
@Test
public void fooTest() {
ProducerCreator producerCreatorMock = Mockito.mock(ProducerCreator.class);
PowerMockito.mockStatic(ProducerCreator.class);
PowerMockito.when(ProducerCreator.class, "createProducer", "name").thenReturn(producerCreatorMock);
(也試過這樣:
PowerMockito.when(ProducerCreator.create("name")).thenReturn(producerCreatorMock);
但它沒有做任何改變)
MyProducer myProducer = new MyProducer();
assertTrue(myProducer.foo());
}
一般來說,我得到類似如下:
org.mockito.exceptions.misusing.UnfinishedStubbingException:
...
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!
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed
或任何其他錯誤或不必要的行爲,而不是適當的嘲弄。 由於界面中「靜態默認」方法的問題? 在互聯網上沒有找到任何這種情況下的例子。
UPD: 我不能分享真實的代碼,因爲它是專有的。
有來自外部的包真正的靜態默認方法,它編譯:
public interface ProducerCreator extends Closeable {
static default ProducerCreator create(String serviceUrl) throws ProducerCreatorException {
return ...
}
UPD 2:該軟件包是一個JNI包 - 從CPP代碼生成..
你確定方法是默認和靜態..這組合會導致編譯錯誤。 –
當然,當然。我看到代碼:) –
你不能有一個同時具有'static'和'default'的接口方法。這個「肯定,肯定」告訴我們,你還沒有試圖編譯你的代碼示例,也沒有做盡職調查。 「我看到代碼」甚至意味着什麼?該回應使您的問題無效。 http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.4「如果一個方法被多個修飾符聲明,那麼這是一個編譯時錯誤'抽象「,」默認「或」靜態「。請告訴我們你的_real_代碼。你展示的內容無法編譯。 –