Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JUnitEasyMock—将单元测试方法作为a)方法b)在类c)中作为mvn构建调用的虚假结果 Easymock 3.5.1 JUnit 4.12 Maven 3.5.0 Intellij Build#IU-181.5281.24,于2018年6月12日建成_Maven_Intellij Idea_Junit_Easymock - Fatal编程技术网

JUnitEasyMock—将单元测试方法作为a)方法b)在类c)中作为mvn构建调用的虚假结果 Easymock 3.5.1 JUnit 4.12 Maven 3.5.0 Intellij Build#IU-181.5281.24,于2018年6月12日建成

JUnitEasyMock—将单元测试方法作为a)方法b)在类c)中作为mvn构建调用的虚假结果 Easymock 3.5.1 JUnit 4.12 Maven 3.5.0 Intellij Build#IU-181.5281.24,于2018年6月12日建成,maven,intellij-idea,junit,easymock,Maven,Intellij Idea,Junit,Easymock,我有一个单元测试,包含在这个单元测试中的是我的问题方法: @Test(expected = CheckoutException.class) public void performCheckout_CheckoutException() throws Exception { // setup test data Order order = new OrderImpl(); OMSOrder omsOrder = new OMSOrderImpl(); Order

我有一个单元测试,包含在这个单元测试中的是我的问题方法:

@Test(expected = CheckoutException.class)
public void performCheckout_CheckoutException() throws Exception {

    // setup test data
    Order order = new OrderImpl();
    OMSOrder omsOrder = new OMSOrderImpl();
    Order omsOrderProxy = OMSOrderProxy.proxify(order, omsOrder, Logger.getRootLogger());
    omsOrderProxy.setId(1L);

    FulfillmentOrder fulfillmentOrder = new FulfillmentOrderImpl();
    FulfillmentGroup fulfillmentGroup = new FulfillmentGroupImpl();
    fulfillmentGroup.setType(FulfillmentType.DIGITAL);
    fulfillmentOrder.setFulfillmentGroup(fulfillmentGroup);

    ((OMSOrder)omsOrderProxy).getAllFulfillmentOrders().add(fulfillmentOrder);

    ProcessContext<CheckoutSeed> context = new DefaultProcessContextImpl<>();

    // create the expected flow
    expect(orderService.save(anyObject(Order.class), eq(false))).andReturn(order).times(2);
    replay(orderService);

    expect((ProcessContext<CheckoutSeed>)checkoutWorkflow.doActivities(anyObject(CheckoutSeed.class))).andReturn(context);
    replay(checkoutWorkflow);

    expect(fulfillmentService.fulfill(anyObject(FulfillmentOrder.class))).andThrow(new FulfillmentException());
    replay(fulfillmentService);

    // test
    checkoutService.performCheckout(omsOrderProxy);

    // check results
    verify(orderService);
    verify(checkoutWorkflow);
    verify(fulfillmentService);

}
第151行(在上面代码行中详细说明)涉及:

expect(orderService.save(anyObject(Order.class), eq(false))).andReturn(order).times(2);
这是这个方法中的一条线

现在,为了获取异常详细信息,我从
@Test
注释中删除了“expected”属性,抛出的异常更清晰:

java.lang.IllegalStateException: 2 matchers expected, 12 recorded.
This exception usually occurs when matchers are mixed with raw values when recording a method:
    foo(5, eq(6));  // wrong
You need to use no matcher at all or a matcher for every single param:
    foo(eq(5), eq(6));  // right
    foo(5, 6);  // also right
    at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:52)
    at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:41)
    at org.easymock.internal.RecordState.invoke(RecordState.java:51)
    at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:40)
    at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94)
    at com.sun.proxy.$Proxy27.save(Unknown Source)
    at com.central.core.checkout.service.TestCheckoutServiceImpl.performCheckout_CheckoutException(TestCheckoutServiceImpl.java:151)
java.lang.IllegalStateException:需要2个匹配器,记录了12个。
记录方法时,当匹配器与原始值混合时,通常会发生此异常:
foo(5,等式(6));//错误的
您根本不需要使用匹配器,也不需要为每个参数使用匹配器:
foo(等式(5),等式(6));//正确的
foo(5,6);//也对
位于org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:52)
在org.easymock.internal.ExpectedInvocation.(ExpectedInvocation.java:41)
位于org.easymock.internal.RecordState.invoke(RecordState.java:51)
位于org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:40)
位于org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94)
位于com.sun.proxy.$Proxy27.save(未知源)
位于com.central.core.checkout.service.TestCheckoutServiceImpl.PerformCheckOutException(TestCheckoutServiceImpl.java:151)
此外,当我在Intellij中运行一组测试时,比如在单元测试类所在的包级别(
com.central.core.checkout.service
),我会遇到同样的错误。我已经删除了
.m2/repository
中所有其他版本的easymock,以确保没有冲突

问题是,;为什么只有在
mvn干净安装时(在Intellij或cmd行中)和在包级单元测试运行时才会发生此错误

我想我真正关心的是,除了取决于测试运行方式的不同结果之外,抛出的异常:

java.lang.IllegalStateException:需要2个匹配器,记录了12个匹配器。

告诉我有
2个匹配器和12个录制的
。这是否包括在其他单元测试中创建的单元测试,就像跨越一个测试会话一样?我发现这很难相信,因为每个单元测试方法在调用之前都会创建一个新的模拟

于7月6日15:21添加

因此,为了加快当前的构建过程并实现没有失败的单元测试,我将忽略这个失败的单元测试并尝试构建。生成再次失败,但这一次前面的方法是有问题的子级,出现了类似的异常:

java.lang.IllegalStateException:需要2个匹配器,记录了12个。
记录方法时,当匹配器与原始值混合时,通常会发生此异常:
foo(5,等式(6));//错误的
您根本不需要使用匹配器,也不需要为每个参数使用匹配器:
foo(等式(5),等式(6));//正确的
foo(5,6);//同样正确


我尝试了一个小实验,忽略了这个当前失败的方法,并尝试了另一个构建,但在我知道类中前面的下一个方法将是问题孩子之前。瞧,原来是这样。

你坐得舒服吗?然后我将开始

所以我发布了这个问题,当然我一直在寻找解决方案。在修复单元测试时,我用尽了所有的渠道,所以我决定从不同的角度来看待这个问题。当开发环境建立时,这个问题就暴露了出来。我注意到有两个构建非常接近。前者成功了,但后者因上述例外而失败

现在,为了确定两个构建之间的差异,我进行了所有的Columbo测试,结果证明这只是一个小单元测试。这个单元测试是一个直接的单元测试,因为它不需要任何类型的模拟。奇怪的是,
Easymock.eq
被导入。奇怪的是,甚至更奇怪的是,它包含在
assertEquals
语句中,“预期”值被包装在
eq()
中。用韩·索洛睿智的话来说,“我对此有种不好的感觉”

我删除了这个导入,连同
eq()
,单独运行了单元测试方法…成功。然后,我通过测试运行调用了一个构建。成功


因此,我从中了解到,在错误的上下文中使用
Easymock.eq()
方法,在本例中,
Assert.assertEquals()
确实会发生奇怪的事情,但仍然不确定原因。更奇怪的是,在我的IDE中单独运行单元测试成功了-/

我将在EasyMock insight的框架下为您提供一些帮助,以帮助您理解

使用匹配器时,它存储在
ThreadLocal
中。因此,当模拟方法调用实际发生时,每个参数的匹配器都位于线程本地。EasyMock将它们从那里移除,并创建呼叫期望

所以,当太多的匹配者在录制时,一切都会发生偏差,奇怪的事情就会发生。这就是错误消息所说的。记录了12个匹配器,但预期只有2个,因为您的方法有2个参数


由于Maven和IntelliJ没有在测试之间分出一个新的虚拟机,所以从一个测试到另一个测试,糟糕的匹配者仍然存在。

这就是我的想法,令人担忧。我希望我的单元测试是完全隔离的,而不是让它们从其他测试中借用状态。也就是说,这就是它,我们让它发挥作用。我已经研究了
reset()
方法,并将其转换为
@Before
方法,但这似乎并没有像我所希望的那样“重置”模拟,也就是说,匹配器的数量在有或没有
reset()
的情况下保持在12个。无论如何,谢谢你的回复。重置不会有帮助。因为
java.lang.IllegalStateException: 2 matchers expected, 12 recorded.
This exception usually occurs when matchers are mixed with raw values when recording a method:
    foo(5, eq(6));  // wrong
You need to use no matcher at all or a matcher for every single param:
    foo(eq(5), eq(6));  // right
    foo(5, 6);  // also right
    at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:52)
    at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:41)
    at org.easymock.internal.RecordState.invoke(RecordState.java:51)
    at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:40)
    at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94)
    at com.sun.proxy.$Proxy27.save(Unknown Source)
    at com.central.core.checkout.service.TestCheckoutServiceImpl.performCheckout_CheckoutException(TestCheckoutServiceImpl.java:151)