2017-03-24 10 views
0

PowerMockを使用してコンストラクターを嘲笑しました。PowerMockコンストラクターモックが動作しません

@RunWith(PowerMockRunner.class) 
@PrepareForTest(SubjectClass.class) 
class SomeClassTest { 
    @Mock 
    SubjectClass subjectObject; 
    @InjectMock 
    SomeClass someObject; 
    ... 
    @Test 
    public void testMethod_inp_exp() throws Exception { 
     PowerMock.whenNew(SubjectClass.class).withAnyArguments().thenReturn(subjectObject); 
     when(subjectObject.subjectMethod(someParameters).thenReturn(null); 
     assertThat(someObject.someMethod(someOtherParam).isEqualTo(someCondition); 
    } 
} 

これはモックコンストラクタには十分ではありませんか?不足しているものはありますか?

コードはのsomeMethodで呼び出されているので、私はfalseを取得しています。

+0

私はそれをテストできるように完全なコードを投稿することができます。 –

+0

これはプロプライエタリなコードです。何が特別に必要ですか?矛盾していると思われるものは何ですか?このコードを抽象変数名で追加します。 –

+0

あなたのコードに問題はないようです:@PrepareForTest({SubjectClass.class、SomeClass.class}) –

答えて

1

docsが明示的にあなたがすべきモックコンストラクタへの順序であることを述べる:例えば、

使用PowerMockito.whenNew

whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message")); 

あなたがテストのために MyClassの新しいインスタンスを作成したクラスを用意する必要があります、ありませんMyClassそのもの。例えば。新しい MyClass()を行うクラスがX呼び出された場合、あなたはwhenNewが動作するためには@PrepareForTest(X.class) を行う必要があるだろう:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(X.class) 
public class XTest { 
     @Test 
     public void test() { 
       whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message")); 

       X x = new X(); 
       x.y(); // y is the method doing "new MyClass()" 

       .. 
     } 
} 

だからあなたの場合には、あなたが@PrepareForTest(SomeClass.class)

@PrepareForTest(SubjectClass.class)を交換する必要があるだろう
-1
SubjectClass subjectClassMock=EasyMock.createNiceMock(SubjectClass.class); 
PowerMock.expectNew(SubjectClass.class,<your arguments for constructor>).andReturn(subjectClassMock); 

あなた@PrepareForTestにSubjectClassと工assの両方を追加し、PowerMock.replayAllを(行うようにしてください)。

+0

これは私のやり方と同等ではありません。 –

関連する問題