2017-09-07 40 views
0

我想寫以下方法的常規單元測試:「java.util.NoSuchElementException:沒有出席java.util.Optional.get值」在斯波克測試使用嘲笑

public Set<ObjectName> getAll() 
{ 

    return getMBeanServerConnection().map(mbsc -> 
    { 
     try 
     { 
      return mbsc.queryNames(null, null); 
     } 
     catch (IOException e) 
     { 
      logger.log(Level.SEVERE, "An exception was thrown: ", e); 
      return Collections.<ObjectName>emptySet(); 
     } 
    }).get(); 
} 

該方法調用以下:

private Optional<MBeanServerConnection> getMBeanServerConnection() 
{ 
    return virtualMachineHelper.getMb(); 
} 

然後:

public Optional<MBeanServerConnection> getMb() 
{ 
    VirtualMachine virtualMachine = getOmsVirtualMachine(); 
    if (virtualMachine == null) 
    { 
     return Optional.empty(); 
    } 
    try 
    { 
     Properties props = virtualMachine.getAgentProperties(); 
     String connectorAddress = 
      props.getProperty(JMX_REMOTE_PROPERTY); 

     JMXServiceURL url = new JMXServiceURL(connectorAddress); 
     JMXConnector connector = JMXConnectorFactory.connect(url); 
     MBeanServerConnection mbsc = connector.getMBeanServerConnection(); 
     return Optional.of(mbsc); 
    } 
    catch (IOException e) 
    { 
     logger.log(Level.SEVERE, "An exception was thrown: ", e); 
     return Optional.empty(); 
    } 
} 

這只是轉發呼叫噸方法0 mbsc.queryNames(null,null)

我試圖測試,當調用getAll()然後mbsc.queryNames(null,null)被調用一次。

我有以下代碼:

def virtualMachineHelperMock = Mock(VirtualMachineHelper) 
def mBeanServerConnection = Mock(MBeanServerConnection) 

ObjectNamesRepository objectNamesRepository = new ObjectNamesRepository(virtualMachineHelperMock) 

void setup() { 
    virtualMachineHelperMock.getMb() >> Optional.of(mBeanServerConnection) 
} 

def "when calling getAll then queryNames is called from mBeanServerConnection"() { 
    when: 
    objectNamesRepository.getAll() 

    then: 
    1 * mBeanServerConnection.queryNames(null, null) 
} 

但是,這提供了以下錯誤:

java.util.NoSuchElementException: No value present

at java.util.Optional.get(Optional.java:135) 
at com.ullink.ulconsole.repository.ObjectNamesRepository.getAll(ObjectNamesRepository.java:73) 
at com.ullink.ulconsole.repository.ObjectNamesRepositorySpec.GetAll(ObjectNamesRepositorySpec.groovy:32) 
+0

你可以發佈更多的代碼,例如中'getMBeanServerConnection()' –

+0

當然,我已經編輯過這篇文章 –

回答

2

這是因爲沒有存根的mbsc.queryNames(null, null)呼叫響應被記錄,所以模擬returns the default valuenull。而contract of Optional.map()如下:

If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional.

您從map()呼叫得到一個空Optional,因此例外。

爲了解決這個問題,你可以存根在同一個交互調用,如Spock documentation描述:

1 * mBeanServerConnection.queryNames(null, null) >> Collections.emptySet()