2014-02-07 37 views
1

我最近遇到了EasyMock的一個奇怪問題。 這裏是我正在測試無法使用EasyMock覆蓋使用org.openide.nodes.Node方法調用的函數

package com.test.junits; 

import org.openide.nodes.Node; 

public class IsRoot { 
    public boolean isRoot(Node node) { 
     Node parentNode = node.getParentNode(); 
     return (parentNode == null); 
    } 
} 

而且這裏的類是JUnit類

package com.test.junits 

import static org.junit.Assert.assertNotNull; 

import org.easymock.EasyMock; 
import org.junit.Before; 
import org.junit.Test; 
import org.openide.nodes.Node; 

public class IsRootTest { 

private IsRoot isroot; 
private Node node; 

@Before 
public void setUp() { 
    isroot = new IsRoot(); 
    node = EasyMock.createMock(Node.class); 
} 

@Test 
public void gettingExpectationsForGetParentFromNode() { 
    Node node = EasyMock.createMock(Node.class); 
    Node parentNode = EasyMock.createMock(Node.class); 

    EasyMock.expect(node.getParentNode()).andReturn(parentNode); 

    EasyMock.replay(node); 
    isroot.isRoot(node); 
    EasyMock.verify(node); 
} 

當我嘗試運行它,我得到下面的異常(與Maven和eclipse)

java.lang.IllegalStateException: no last call on a mock available 
    at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:521) 
    at org.easymock.EasyMock.expect(EasyMock.java:499) 
    at com.test.junits.IsRootTest.gettingExpectationsForGetParentFromNode(IsRootTest.java:47) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99) 
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75) 
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45) 
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71) 
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35) 
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

我在這裏錯過了什麼嗎? 任何幫助,將不勝感激。

+1

http://stackoverflow.com/questions/3494969/easymock-3-0-mocking-class-throws-java-lang-illegalstateexception-no-last-call –

回答

-1

這可能是與你有一個名爲node局部領域,並呼籲node這兩個類變量是Node類和這兩者都是嘲笑的事實。

我會刪除測試本地node完全,或重命名它,如果你真的想要一個測試,本地的模擬node

編輯

我以前的答案是錯的,並且確實是一個評論。 隱藏的物體沒有造成任何問題。 (雖然我仍然認爲他們應該被刪除/改名)

這裏的實際問題是,你試圖模擬的方法是final,因此,不能被嘲笑。

當EasyMock mocks方法/類,它通過擴展和覆蓋它們來實現。所以最終的類和最終的方法不能被EasyMock嘲笑,因爲它們不能被覆蓋。

getParentNode()方法的調用沒有被模擬,因此在期望調用中沒有在記錄狀態期間註冊。

+0

我嘗試相同的代碼。它不是名稱或變量的問題。 Easymock無法驗證它。 –

+0

@RaghunandanKrishnamurthy你沒有錯。我發現被嘲笑的方法是最終的,並改變了我的答案。儘管如此,即使在測試中,野外隱藏也不是一個好計劃。 –