2017-05-24 95 views
0

我一直在學習更多關於Java中的Mockito框架,並且我迷失瞭如何完成這個單元測試。Mockito - Spring單元測試

基本上,控制檯的錯誤指出,當Bar.sayHi()方法試圖從Foo測試運行時,存在NullPointerException。我懷疑它與自動佈線領域有關(但我可能錯了)?

下面是問題的一個簡單的例子,我遇到:

@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 

    } 

} 

這裏是正在測試的FooImpl類(有Foo的接口):

public class FooImpl implements IFoo { 

    @Autowired 
    private IBar bar; 

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

} 

,酒吧(還有一個Bar的界面):

public class BarImpl implements IBar { 

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

} 

有沒有人有建議這個?謝謝。

+1

https://dzone.com/articles/use-mockito-mock-autowired根據這一點,你可能需要'@ InjectMocks'上'FooImpl'例如允許自動的Mockito創建它(並注入依賴關係)而不是手動創建。你嘗試過嗎? –

+0

我現在就試試這個,但是我使用的是Mockito Cookbook(Marcin Grejszczak),書中提到你可以使用setUp方法或InjectMocks進行初始化 - 所以我認爲它們是一樣的。 – rj2700

回答

3

只是創建一個Ibar的模擬不會注入@Autowired字段的模擬。 自動裝配是Spring的工作,而不是Mockito。 你需要明確地告訴使用的Mockito @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(); 
    } 

} 

或手動設置模擬對象的測試對象中注入那些爲測試對象。

@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 

    } 

}