gpt4 book ai didi

java - 模拟类的所有实例

转载 作者:行者123 更新时间:2023-12-02 12:12:35 25 4
gpt4 key购买 nike

我知道这通常是一种不好的做法,但就我而言,这是必要的。

我有一个例子,枚举持有一个类来获取一些信息。这样 Enum 在其构造函数中创建了该类的实例。

public enum MyEnum {
CONSTANT(new MyImpl());

private final MyImpl myImpl;

private MyEnum(final MyImpl impl) {
this.myImpl = impl;
}

public void sayHello() {
System.out.println(this.myImpl.getSomethingToSay());
}

}

MyImpl.java 只是一个具有返回字符串的单个方法的类。

public class MyImpl {

public String getSomethingToSay() {
return "Hello!";
}

}

现在终于是单元测试了:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;

@RunWith(MockitoJUnitRunner.class)
@PrepareForTest({ MyImpl.class, MyEnum.class })
public class MyEnumTest extends PowerMockTestCase {
@Test
public void testSmth2() throws Exception {
MyImpl impl = Mockito.mock(MyImpl.class);
Mockito.when(impl.getSomethingToSay()).thenReturn("It works!");
PowerMockito.whenNew(MyImpl.class).withAnyArguments().thenReturn(impl);

System.out.println(impl.getSomethingToSay());
System.out.println(new MyImpl().getSomethingToSay());
MyEnum.CONSTANT.sayHello();
}
}

输出为:

It works!
Hello!
Hello!

但应该是 3 倍才有效!

最佳答案

我发现了有问题的部分。

我变了

@RunWith(MockitoJUnitRunner.class)

@RunWith(PowerMockRunner.class)

现在 mock 起作用了。但我不得不说,正如乔恩·斯基特(Jon Skeet)打印出来的那样,枚举并没有到处都有 mock 成员实例的地方。因此,在另一个单元测试中调用 MyEnum.CONSTANT.sayHello(); 将再次打印 it Works 而不是 Hello!

关于java - 模拟类的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20797396/

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