gpt4 book ai didi

java - 在 JUnit 测试中使用 JMockit 多次模拟静态方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:15 26 4
gpt4 key购买 nike

我有一个包含静态方法的类,我目前正在使用 JMockit 对其进行模拟。说它看起来像:

public class Foo {
public static FooValue getValue(Object something) {
...
}
public static enum FooValue { X, Y, Z, ...; }
}

我有另一个调用 Foo 静态方法的类(我们称它为 MyClass);我正在尝试为此类编写测试用例。我的 JUnit 测试使用 JMockit,看起来像这样:

public class MyClassTest extends TestCase {
@NonStrict private final Foo mock = null;

@Test public void testMyClass() {
new Expectations() {
{
Foo.getValue((Object) any); result = Foo.FooValue.X;
}
};
}

myClass.doSomething();
}

这很好用,当测试执行时,我的 MyClass 实例将在调用 Foo.getValue() 时正确获取 Foo.FooValue.X 的枚举值。

现在,我尝试遍历所有 枚举中的值,并重复运行测试。如果我将上面的测试代码放在一个 for 循环中,并尝试将模拟静态方法的结果设置为每个枚举值,那是行不通的。 Foo.getValue() 的模拟版本始终返回 Foo.FooValue.X,并且在我遍历枚举时从不返回任何其他值。

如何在单个 JUnit 测试中多次模拟静态方法?我想做这样的事情(但显然行不通):

public class MyClassTest extends TestCase {
@NonStrict private final Foo mock = null;

@Test public void testMyClass() {

for (final Foo.FooValue val : Foo.FooValue.values() {

new Expectations() {
{
// Here, I'm attempting to redefine the mocked method during each iteration
// of the loop. Apparently, that doesn't work.
Foo.getValue((Object) any); result = val;
}
};

myClass.doSomething();
}

}
}

有什么想法吗?

最佳答案

您应该在一次记录中记录多个连续的返回值,而不是“多次模拟该方法”:

public class MyClassTest extends TestCase
{
@Test
public void testMyClass(@Mocked Foo anyFoo)
{
new Expectations() {{
Foo.getValue(any);
result = Foo.FooValue.values();
}};

for (Foo.FooValue val : Foo.FooValue.values() {
myClass.doSomething();
}
}
}

如果需要更大的灵 active ,也可以使用 Delegate 来完成。

关于java - 在 JUnit 测试中使用 JMockit 多次模拟静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4904041/

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