Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使模拟的singleton';s方法在不同的测试用例中表现不同_Java_Spring_Unit Testing_Singleton_Powermockito - Fatal编程技术网

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上是否有注释运行哇,这真的很聪明而且很有效!非常感谢你!