4

我想我可能在 JMockit 中发现了一个错误,但我想确认它是一个错误还是我遗漏了一些东西。

我有以下(非常简单)类:

public class Dummy {
    public void foo() {System.out.println("O");}
}

现在我有以下测试,在每个测试中,我都尝试多次模拟方法“foo”(每个测试都有点不同):

测试#1

@Test
public void test1() {

    new MockUp<Dummy>() {

        @Mock
        public void foo(Invocation inv) {

            System.out.println("A");
            inv.proceed();
        }
    }

    new MockUp<Dummy>() {

        @Mock
        public void foo(Invocation inv) {

            System.out.println("B");
            inv.proceed();
        }
    }

    new Dummy().foo();
}

测试#2

@Test
public void test2() {

    mock("A");
    mock("B");
    new Dummy().foo();
}

private void mock(final String s) {

    new MockUp<Dummy>() {

        @Mock
        public void foo(Invocation inv) {

            System.out.println(s);
            inv.proceed();
        }
    }
}

测试之间的唯一区别是将模拟代码提取到不同的方法。但是结果不一样...

测试 #1 输出:

B
A
B
O

这很奇怪,因为我根本没想到 A 会出现。但无论如何,这是测试 #2 的输出:

B
A
A
A
...ad infinitum

测试 #2 将失败并出现 StackOverflowError。

这是一个错误还是我错过了什么?

更新(使用解决方案)

正如@Rogério 提到的,这种行为是不可接受的。
那么如何覆盖模拟呢?像这样:

private MockUp<Dummy> mock;

@Test
public void test3() {

        mockCorrectly("A");
        mockCorrectly("B");
        new Dummy().foo();
}


private void mockCorrectly(final String s) {

    if (mock != null) {
        mock.tearDown();
    }

    mock = new MockUp<Dummy> {

        @Mock
        public void foo(Invocation inv) {

            System.out.println(s);
            inv.proceed();
        }
    }
}

对于输出:

B
O

伟大的 :)

4

1 回答 1

4

目前尚不清楚这里到底发生了什么。显然,在运行时会发生一些“链式模拟”。

真正的问题是两个测试都在使用MockUpAPI 做一些无效的事情:它们在同一个测试中两次模拟同一个类中的同一个方法。在同一个测试中为同一个类有两个不同的模型是可以的,只要它们模拟不同的方法/构造函数。

结果行为是未定义的,因为 JMockit 不支持同一方法的多个同时模拟。

于 2013-08-14T13:12:26.080 回答