模拟类的所有实例

我知道这通常是一种不好的做法,但在我的情况下,这是必要的。

我有一个案例,一个枚举持有一个类来获得一些信息。因此,Enum 在其构造函数中创建该 calss 的实例。

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只是一个具有返回 String 的单个方法的类。

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倍它的工作原理!


答案 1

我发现了有故障的部分。

我改变了

@RunWith(MockitoJUnitRunner.class)

@RunWith(PowerMockRunner.class)

现在,嘲笑奏效了。但我不得不说,正如Jon Skeet打印出来的那样,枚举并不是到处都是嘲笑成员实例的地方。因此,在另一个单元测试中,调用将再次打印而不是 。MyEnum.CONSTANT.sayHello();it worksHello!


答案 2

推荐