gpt4 book ai didi

java - JMockit:如何用新的模拟覆盖已经模拟的方法?

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:45 25 4
gpt4 key购买 nike

我想我可能在 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 提到的,这种行为是 Not Acceptable 。
那么如何覆盖 mock 呢?像这样:

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

太好了:)

最佳答案

不清楚这里究竟发生了什么;显然,在运行时发生了一些“链式模拟”。

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

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

关于java - JMockit:如何用新的模拟覆盖已经模拟的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18227448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com