java “IllegalStateException: 缺少先前方法调用的行为定义”,即使行为已定义

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11055068/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 03:36:34  来源:igfitidea点击:

'IllegalStateException: missing behavior definition for preceeding method call' even though behavior is defined

javajuniteasymock

提问by SpreckFoo

I'm getting some inexplicable behavior from easymock and a JUnit test case. I'm receiving an IllegalStateException: missing behavior definition for the preceeding method call: myCollaborator.getCurrentApplyDate() Usage is: expect(a.foo()).andXXX(). I'm using easymock 3.1 to mock myCollaboratorin a JUnit 4 test class that is testing classUnderTest.

我从 easymock 和 JUnit 测试用例中得到了一些莫名其妙的行为。我正在收到一个IllegalStateException: missing behavior definition for the preceeding method call: myCollaborator.getCurrentApplyDate() Usage is: expect(a.foo()).andXXX(). 我正在使用 easymock 3.1myCollaborator在一个正在测试的 JUnit 4 测试类中进行模拟classUnderTest

classUnderTestneeds to make two calls to myCollaborator. With just one call in place everything works fine. The @Beforesetup method in my JUnit test class:

classUnderTest需要两次调用myCollaborator. 只需一个电话,一切正常。@Before我的 JUnit 测试类中的设置方法:

@Before
public void setUp() throws Exception {
    mockCollaborator = EasyMock.createMock(MyCollaborator.class);
    classUnderTest = new myObject(mockCollaborator);
    data = new MyDTO();
    // other setup code for data omitted
    EasyMock.expect(mockCollaborator.getCurrentApplyDate()).andReturn(new java.sql.Date(123456789));
    // comment out this expectation for now so it works
    // EasyMock.expect(mockCollaborator.getCurrentBatch()).andReturn("123");
    EasyMock.replay();
}

The classUnderTest.process()method that I'm testing with the two calls to myCollaborator, the second one commented out so that it will work:

classUnderTest.process()我用两次调用测试的方法,myCollaborator第二个被注释掉以便它可以工作:

public MyDTO process(MyDTO data) throws Exception {
    // do some stuff to data
    java.sql.Date myDate = myCollaborator.getCurrentApplyDate();
    // do some stuff with myDate and data
    // comment out this call for now so it works
    // String currentBatch = myCollaborator.getCurrentBatch();
    // do some other stuff with currentBatch and data
    return data;
}

Once I uncomment the 2nd call (the one to myCollaborator.getCurrentBatch()) from the process()method and uncomment the expectation from the JUnit setUp()I start receiving the aforementioned IllegalStateException.

一旦我myCollaborator.getCurrentBatch()process()方法中取消注释第二个调用(第一个调用)并取消对 JUnit 的期望的注释,setUp()我就开始收到上述IllegalStateException.

The code with those uncommented that doesn't work:

那些未注释的代码不起作用:

@Before
public void setUp() throws Exception {
    mockCollaborator = EasyMock.createMock(MyCollaborator.class);
    classUnderTest = new myObject(mockCollaborator);
    data = new MyDTO();
    // other setup code for data omitted
    EasyMock.expect(mockCollaborator.getCurrentApplyDate()).andReturn(new java.sql.Date(123456789));
    EasyMock.expect(mockCollaborator.getCurrentBatch()).andReturn("123");
    EasyMock.replay();
}

public MyDTO process(MyDTO data) throws Exception {
    // do some stuff to data
    java.sql.Date myDate = myCollaborator.getCurrentApplyDate();
    // do some stuff with myDate and data
    String currentBatch = myCollaborator.getCurrentBatch();
    // do some other stuff with currentBatch and data
    return data;
}

The return types of java.sql.Dateand Stringare correct for these two methods. These methods are just getters like they sound; all they do is return instance variable values; no other processing or method calls occur in these getter methods.

返回类型java.sql.DateString对于这两种方法是正确的。这些方法听起来就像是吸气剂;他们所做的只是返回实例变量值;在这些 getter 方法中不会发生其他处理或方法调用。

The JUnit test method:

JUnit 测试方法:

@Test
public void testSomeFunctionality(){
    // alter data to setup this test case
    try {
        data = classUnderTest.process(data);
    } catch (Exception e) {
        // this is line 531, where the IllegalStateException is being caught
        fail("error msg " + e);
    }
    assertTrue(data.getSomeValue() == expectedValue)
}

The full stack trace:

完整的堆栈跟踪:

java.lang.AssertionError: An unexpected exception has occurred:
java.lang.IllegalStateException: missing behavior definition for the preceding method call:
MyCollaborator.getCurrentApplyDate()
Usage is: expect(a.foo()).andXXX()
at org.junit.Assert.fail(Assert.java:91)
at qualified.package.name.ClassUnderTestTests.testSomeFunctionality(ClassUnderTestTests.java:531)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access
EasyMock.replay();
0(ParentRunner.java:42) at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 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)

I've used easymock and JUnit extensively in the past in exactly this manner and have never run into anything like this before. My colleagues are likewise stymied, so bonus kode monkey karma to anyone who can shed some light on whatever is going on here.

过去,我以这种方式广泛使用了 easymock 和 JUnit,以前从未遇到过这样的事情。我的同事也同样受阻,因此任何能够了解这里发生的事情的人都会获得额外的 kode monkey karma。

回答by Drew MacInnis

In your @Before example you show:

在您的@Before 示例中,您显示:

EasyMock.replay(mockCollaborator);

Shouldn't this be:

这不应该是:

##代码##