Java 无法使模拟的singleton';s方法在不同的测试用例中表现不同
一个类的单元测试涉及另一个类中的静态方法,例如Java 无法使模拟的singleton';s方法在不同的测试用例中表现不同,java,spring,unit-testing,singleton,powermockito,Java,Spring,Unit Testing,Singleton,Powermockito,一个类的单元测试涉及另一个类中的静态方法,例如HelperClassHelperClass有一个单例成员。我使用Junit进行单元测试,并使用Powermockito模拟singleton成员。但是我发现singleton成员的方法的行为只能指定一次 //the class to be tested class Activity { public void enact() { //some logic String str = HelperClass.do
HelperClass
HelperClass
有一个单例成员。我使用Junit
进行单元测试,并使用Powermockito
模拟singleton成员。但是我发现singleton成员的方法的行为只能指定一次
//the class to be tested
class Activity {
public void enact() {
//some logic
String str = HelperClass.doSomething();
//some other logic
}
}
class HelperClass {
private static final singleton = Singleton.getInstance();
public static String doSomething() {
//some logic
AnObject obj;
try {
obj = singleton.doSomething();
} catch (Exception1 e) {
//Some other logic
throw new Exception2("Some message" + e.getMessage(), e);
}
String val = obj.doSomething();
return val;
}
}
class Singleton {
private Singleton instance = null;
private void Singleton() { /*some logic*/ }
public static Singleton getInstance() {
if (instance == null) {
Singleton();
}
return instance;
}
public String doSomething() throws Exception1 {
//some logic
}
}
我的uint测试是这样的
@RunWith(PowerMockRunner.class)
@PrepareForTest(Singleton.class)
class ActivityTest {
//some logic
private Activity activity;
@Before
public void setup() {
//some logic
PowerMockito.mockStatic(Singleton.class);
activity = new Activity();
}
@Test(expected = Exception2.class)
void test1() {
Singleton mockSingleton = mock(Singleton.class);
when(mockSingleton.doSomething()).thenThrow(new Exception1("Test Exception1"));
PowerMockito.when(Singleton.getInstance()).thenReturn(mockSingleton);
activity.enact();
}
@Test
void test2() {
Singleton mockSingleton = mock(Singleton.class);
when(mockSingleton.doSomething()).thenReturn("");
PowerMockito.when(Singleton.getInstance()).thenReturn(mockSingleton);
activity.enact();
}
}
但它不起作用。尽管我指定了
mockSingleton
的doSomething()
的不同行为,但是mockSingleton
仍然像在test1
中一样在test2
中抛出异常2
。似乎该行为只能指定一次。有人能告诉我如何让这里的doSomething()
具有不同的行为吗?您正在调用Signleton.getInstance
仅一次-当HelperClass
初始化时。这样,您总是使用第一次测试中的模拟。要解决这个问题,每次需要Singleton
的实例时,都可以调用getInstance
因此,HelperClass
的代码是:
class HelperClass {
public static String doSomething() {
//some logic
AnObject obj;
try {
obj = Singleton.getInstance().doSomething();
} catch (Exception1 e) {
//Some other logic
throw new Exception2("Some message" + e.getMessage(), e);
}
String val = obj.doSomething();
return val;
}
}
这样,您将在每次运行时获得正确的mock。Mockito用于类,而不是ibstance,静态Mockito可以为类测试保留状态。方法levelWow上是否有注释运行哇,这真的很聪明而且很有效!非常感谢你!