2014-02-07 40 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你没有错。我发现被嘲笑的方法是最终的,并改变了我的答案。尽管如此,即使在测试中,野外隐藏也不是一个好计划。 –