模拟一个类的所有实例

Zar*_*tra 11 java unit-testing enumeration mocking mockito

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

我有一个案例,Enum持有一个类来获取一些信息.这样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());
    }

}
Run Code Online (Sandbox Code Playgroud)

MyImpl.java 只是一个具有返回String的单个方法的类.

public class MyImpl {

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

}
Run Code Online (Sandbox Code Playgroud)

现在最后进行单元测试:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

It works!
Hello!
Hello!
Run Code Online (Sandbox Code Playgroud)

但它应该是它的3倍!

Zar*_*tra 7

我找到了有缺陷的部分.

我变了

@RunWith(MockitoJUnitRunner.class)
Run Code Online (Sandbox Code Playgroud)

@RunWith(PowerMockRunner.class)
Run Code Online (Sandbox Code Playgroud)

现在嘲弄工作.但我不得不说,当Jon Skeet打印出来时,枚举并没有到处嘲笑成员实例.所以在另一个单元测试中,MyEnum.CONSTANT.sayHello();将再次打印调用it works而不是Hello!.