模拟一个类的所有实例

时间:2013-12-27 08:31:26

标签: java unit-testing mocking mockito enumeration

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

我有一个案例,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());
    }

}

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 个答案:

答案 0 :(得分:7)

我找到了有缺陷的部分。

我改变了

@RunWith(MockitoJUnitRunner.class)

@RunWith(PowerMockRunner.class)

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