2017-05-24 6 views
0

私はJava内のMockitoフレームワークについてもっと学びました。このユニットテストを完了するために何をすべきか分かりません。Mockito - スプリングユニットテスト

基本的に、コンソールからのエラーは、Bar.sayHi()メソッドがFooテストから実行しようとしているときにNullPointerExceptionが存在することを示します。私はそれがautowiredフィールドと関係があると思う(しかし、私は間違っているかもしれない)?以下は

は、私はに実行している問題の簡単な例です:

public class FooImpl implements IFoo { 

    @Autowired 
    private IBar bar; 

    public void saySaySay() { 
     bar.sayHi(); 
    } 

} 

バー:

はここでテストの下FooImplクラスです
@RunWith(MockitoJUnitRunner.class) 
public class FooTest { 

    @Mock 
    //@Spy // Cannot spy on an interface 
    IBar bar; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void test() { 

     // Given 
     FooImpl foo = new FooImpl(); 
     foo.saySaySay(); 

     // When 

     // Then 

    } 

} 

(Fooのためのインターフェースがあります)クラス(バー用のインターフェイスもあります):

public class BarImpl implements IBar { 

    @Override 
    public void sayHi() { 
     System.out.println("hello"); 
    } 

} 

誰にも提案はありますかこの?ありがとう。

+1

https://dzone.com/articles/use-mockito-mock-autowiredこれによると、あなたはおそらく、Mockitoが自動的にそれを作成(および注入できるようにするFooImpl'インスタンス 'に' @ InjectMocks'必要あなたのための依存関係)を作成する必要はありません。それを試しましたか? –

+0

私は今これを試してみますが、私はMockito Cookbook(Marcin Grejszczak著)を使っていましたが、setUpメソッドやInjectMocksを使って初期化できると書かれていました。 – rj2700

答えて

3

Ibarのモックを作成しても、そのモックは@Autowiredフィールドに挿入されません。 AutowiringはMockitoではなくSpringの仕事です。 明示的@InjectMock

@RunWith(MockitoJUnitRunner.class) 
public class FooTest { 
    @InjectMocks 
    FooImpl foo; 

    @Mock 
    IBar bar; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 
    @Test 
    public void test() { 
     foo.saySaySay(); 
    } 

} 

または手動テストオブジェクト内のモックオブジェクトを設定を使用して、テストオブジェクトにそれらを注入するmockitoを指示する必要があります。

@Test 
public void test() { 
    FooImpl foo = new FooImpl(); 
    ReflectionTestUtils.setField(foo, "bar", bar); 
    foo.saySaySay();  
} 
0
RunWith(MockitoJUnitRunner.class) 
public class FooTest { 

    @Mock 
    //@Spy // Cannot spy on an interface 
    IBar bar; 


    @InjectMocks 
    private FooImpl foo; 
    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void test() { 

     // Given 
     foo.saySaySay(); 
     verify(bar).sayHi(); 
     // When 

     // Then 

    } 

}