2014-06-06 36 views
8

我遵循@hoaz的建議。但是,我得到空指針異常Mockito NullPointerException

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

@InjectMocks private GeneralConfigService generalConfigService; 
@Mock private SomeDao someDao; 
@Mock private ExternalDependencyClass externalDependencyObject 

@Test 
public void testAddGeneralConfigCallDAOSuccess() { 
    when(someDao.findMe(any(String.Class))).thenReturn(new ArrayList<String>(Arrays.asList("1234"))); 

    //println works here, I am able to get collection from my mocked DAO 

    // Calling the actual service function 
    generalConfigService.process(externalDependencyObject) 
    } 
} 

在我的代碼是這樣的:

import com.xyz.ExternalDependencyClass; 

public class GeneralConfigService{ 

private SomeDao someDao; 

public void process(ExternalDependencyClass externalDependencyObject){ 

// function using Mockito 
Collection<String> result = someDao.findMe(externalDependencyObject.getId.toString()) 
    } 
} 

我也注意到,DAO爲空,所以我這樣做(僅舉,我做了下面的步驟來嘗試,我知道springUnit和或的Mockito XYZ之間的差異):

@Autowired 
private SomeDao someDao; 


@約翰B溶液解決我的問題。不過,我想提一下對我來說不起作用的東西。這是我更新單元測試

@Test 
public void testAddGeneralConfigCallDAOSuccess() { 
    /* 
    This does not work 
    externalDependencyObject.setId(new ExternalKey("pk_1")); 
    // verify statement works and I thought that the class in test when call the getId 
    // it will be able to get the ExternalKey object 
    //verify(externalDependencyObject.setId(new ExternalKey("pk_1"))); 
    */ 

    // This works 
    when(externalDependencyObject.getId()).thenReturn(new ExternalKey("pk_1")); 
    when(someDao.findMe(any(String.Class))).thenReturn(new ArrayList<String>(Arrays.asList("1234"))); 

    .... 
    // Calling the actual service function 
    generalConfigService.process(externalDependencyObject) 
    } 


引用這個問題在:

How do I mock external method call with Mockito

How do I set a property on a mocked object using Mockito?

+3

你爲什麼嘲笑你自動裝配的東西?它聞起來像這樣,應該是純粹的春季風格的整合測試,或純粹的模擬測試。 – Makoto

+0

自從我運行NullPointer的異常之後,我試圖執行@Autowired步驟,但即使在此之後,它仍會運行異常。我看到,當'someDao.findMe(someObject.getId.toString())'執行它不會觸發我的MockDao return語句,而是嘗試評估'someObject.getId.toString()'。當我在'someDao.findMe'的測試中做println時,它會返回集合。我也檢查了調試,'someDao'已經將屬性設置爲generalConfigService。所以不知道爲什麼它正在評估,而不僅僅是返回我的收藏 – Anuj

回答

10

您還沒有嘲笑在externalDependencyObject因此它返回nullgetId行爲並在toString()被稱爲時給你NPE。

你需要一個when(externalDependencyObject.getId()).then...

相關問題