2017-06-22 10 views
-1

:試験下モック静的デフォルトインターフェース方法

クラス:

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がないソースコードを外部パッケージからである。

@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); 
public interface ProducerCreator { 

static default ProducerCreator create(String name) { 
    return new ProducerCreatorImpl(...) 
    } 
} 

は、だから私はPowerMockitoと静的呼び出しを模擬しようとしています

(また、この試みた:

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コードから生成...

+2

public class Producer { public boolean foo(){ return true; } } public interface ProducerCreator { public static ProducerCreator create(String name) { return new ProducerCreatorImpl(name); } Producer createProducer(); } public class MyProducer { private Producer producer = null; private ProducerCreator producerCreator = null; public MyProducer() { producerCreator = create("name"); producer = producerCreator.createProducer(); } public boolean foo() { return producer.foo(); } } public class ProducerCreatorImpl implements ProducerCreator{ public ProducerCreatorImpl(String name) { } @Override public Producer createProducer() { return new Producer(); } } 

そして、私のために働くあなたのテスト、私はいくつかの仮定を行いました。 –

+0

確かに、確かに。私はコードを参照してください:) –

+2

'static'と' default'の両方のインターフェースメソッドを持つことはできません。確かに、あなたがコードサンプルをコンパイルしようとしておらず、デューデリジェンスを行っていないことがわかります。 「コードが見える」とはどういう意味ですか?その応答はあなたの質問を無効にします。 http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.4「メソッドが複数の修飾子で宣言されている場合、コンパイル時エラーです。抽象的な '、'デフォルト '、'静的な 'あなたに_real_コードを教えてください。あなたが示したものはコンパイルできません。 –

答えて

0

あなたのコードはしていませんコンパイル。この方法は、デフォルトと静的の両方であるあなたは確かに...その組み合わせは、コンパイルエラーになります

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ ProducerCreator.class }) 
public class DatasourceTest { 

    @Test 
    public void fooTest() { 


     ProducerCreator producerCreatorMock = Mockito.mock(ProducerCreator.class); 

     PowerMockito.mockStatic(ProducerCreator.class); 
     PowerMockito.when(ProducerCreator.create(Mockito.anyString())).thenReturn(producerCreatorMock); 

     Producer prodMock = Mockito.mock(Producer.class); 
     Mockito.when(producerCreatorMock.createProducer()).thenReturn(prodMock); 
     Mockito.when(prodMock.foo()).thenReturn(false); 

     MyProducer myProducer = new MyProducer(); 
     boolean result = myProducer.foo(); 

     Assert.assertFalse(result); 

     Mockito.verify(prodMock).foo(); 

    } 
} 
+0

私がここに書いたコードは、私が公開できない実際のコードの抽象です。 あなたの例では、静的であればインタフェースは機能しますが、デフォルトでは機能しません。 defaultキーワードを追加した場合は動作しますか? –

+0

いいえ、@Macijejがあなたの質問にコメントしたように、それはコンパイルされません。静的とデフォルトの違法な組み合わせです。私は実際に何かをテストするいくつかのより精巧なテストを追加しました – kism3t

+0

JNIパッケージはどうですか? –

関連する問題