2017-07-08 92 views
0

我有以下ApplicationConfiguration@InjectMocks導致NPE

class ApplicationConfiguration { 
    private SQSConfig SQSConfig; 
    // Other configs and getters/setters 
} 

然後,我有我的Application

class Application { 
    private Dequeuer dequeuer; 

    public void run(ApplicationConfiguration config) { 
     // I need to pass ApplicationConfiguration because there are other variables that I need to use 
     dequeuer = new Dequeuer(config); 
     // Start dequeuer 
    } 
} 

所以在我的測試Application,我想用@InjectMethodDequeuer

class ApplicationTest { 
    @Mock 
    private ApplicationConfig config; 
    @Mock 
    private SQSConfig sqsConfig; 
    @InjectMocks 
    private Dequeuer dequeuer = new Dequeuer(config); 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     when(config.getSQSConfig()).thenReturn(sqsConfig); 
    } 
} 

問題是,th e @InjectMethodwhen之前被初始化,所以我得到了NPE。我該怎麼辦?

+0

您發佈的代碼不會編譯。發佈**真實**代碼。 –

+0

@JBNizet真正的代碼會很長。這個問題的關鍵是如果你需要更多的模擬而不是簡單的'MyClass myClass = mock(MyClass.class)',並且你需要使用'when'來設置你的模擬,那麼如何使用'@InjectMethod'。 – Kousha

+0

我不是要求你真實的代碼。我要求提供真實的代碼來重現問題,並且是有道理的。您正在使用不存在的類,'新的Dequeuer(ApplicationConfiguration)'不是有效的Java代碼... –

回答

0

問題是,@InjectMethod是在什麼時候初始化的,所以我 得到一個NPE。我該怎麼辦?

MockitoAnnotations.initMocks(this)確實會首先創建嘲笑,這是它應該工作的方式。在實例化模擬之前,您不記錄模擬行爲。

此外,它不是@InjectMock而是@InjectMocks

而你沒有正確使用它。

參數不傳遞給構造函數,它會直接由框架的Mockito注入,如果你的Dequeuer類聲明瞭Dequeuer(ApplicationConfig appConfig)構造:

@Mock 
private ApplicationConfig config; 
... 
@InjectMocks 
private Dequeuer dequeuer; 

的NPE可能是由壞使用的引起Mockito框架,但與您的問題中顯示的代碼,這很難識別。

+0

我這樣做了,但@InjectMocks仍然在我的'setUp'中的'when'之前調用。我確認了將'System.out.println'放在'Application','Dequeuer'和測試文件的不同階段。所以我得到一個錯誤,說'你沒有在字段聲明中提供實例,所以我試圖構造實例。 然而,構造函數或初始化塊引發了一個異常:null' – Kousha

+0

'MockitoAnnotations.initMocks(this);'確實會首先創建mock,這是它應該工作的方式。在實例化模擬之前,您不記錄模擬行爲。 – davidxxx