java - 模拟类的所有实例

标签 java unit-testing mocking mockito enumeration

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

我有一个例子,枚举持有一个类来获取一些信息。这样 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/

相关文章:

java - JPQL 查询未返回预期结果

javascript - 如何在 typescript 中模拟 XMLHTTPRequest 以进行单元测试

java - 为什么我要使用 MockWebServer 而不是 WireMock?

java - EasyMock:无效方法

java - RecyclerView LinearLayout 始终出现在其他元素之上

java - 如何跳过 block 中的任何错误并继续下一个 block 项目?

java - Mockito 无法模拟此类 JestClient

unit-testing - 针对条件 (A && B && C) || 执行 MCDC D

.net - 如何模拟 RIA 服务

java - 光线追踪 - 遍历树