当从其他方法调用静态方法时,使用powermockito模拟静态

时间:2016-07-05 15:57:05

标签: java unit-testing mockito junit4 powermockito

代码示例:

@ViewScoped

所以,现在如果我正在测试方法" A",:

  1. 当它调用" connectA()方法"时,我希望它返回我想要的模拟对象
  2. OR

    1. 当"新B"被称为我希望它返回我想要的模拟对象
    2. 如果connectA()方法不是静态的,它可以工作,但我不知道如果它的静态使用powermockito和mockito

      如何使它工作

      因此测试类会像以下一样:

      public class A{
      
          public static B connectA(){
              String new = "java";
              B b = new B("new");
      
              return b;
          }
      
          public void A(){
             B b = connectA();
          }
      }
      
      
      
      public class B{
      
        public B(String A){
           methodB(new);
        }
      
       public static String methodB(String new){
            return new;
       }
      
      
      }
      

      其中BMock是我创建的任何对象!

      任何可能的解决方案?

2 个答案:

答案 0 :(得分:1)

尝试添加

 PowerMockito.mockStatic(A.class);
 PowerMockito.mockStatic(B.class);

但我会重构代码并使用com.google.inject.Provider来创建B类的实例。很容易嘲笑它,你不需要PowerMockito。

<强>更新

此代码对我来说是正确的(我在A类中添加了getter)

package main;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.mockito.Mockito;

@RunWith(org.powermock.modules.junit4.PowerMockRunner.class)
@PrepareForTest({A.class,B.class})
public class ATests{ 

    @Test
    public void testMethodA() throws Exception{
        B BMock = Mockito.mock(B.class);
        PowerMockito.whenNew(B.class).withAnyArguments().thenReturn(BMock);
        A a = new A();
        Assert.assertEquals(BMock, a.getB());
    }
 }

根据注射器。 见参考https://github.com/google/guice/wiki/InjectingProviders 很难理解你想要什么以及你班上的逻辑是什么。因此,只有您了解您的业务规则以及注入的位置。相反,提供商可以使用工厂。但是有一个关于使用工厂的“圣战”。

答案 1 :(得分:0)

所以答案就是,

当我这样嘲笑时:

PowerMockito.mockStatic(B.class);
PowerMockito.when(B.methodB).thenReturn("My mocked String");

然后在这里(&#34;我的模拟字符串&#34;)是一个不同的对象实例,或者我们可以说有不同的对象id(如:a5Gbd @ ass)

但实际上在方法B的构造函数中调用该方法时,会调用它作为&#34; new&#34;传入的变量,它再次具有不同的对象ID(如:affac @ das),所以发生的事情是powermockito认为现在在构造函数中调用的方法和我们在模拟它时引用的方法 - 两者都不同。

这就是为什么它说是powermockito的限制之一。

但是我有一个解决方法,如果你能够在两个地方传递相同的对象实例,它会工作,这样powermockito知道我们正在努力使用相同的方法。

再次,这取决于你的代码的结构,但在我的代码中我看到它是可能的,所以它有所帮助。

帮助我的另一件事是使用powermockito访问私有变量,所以如果有人需要它:

Whitebox.getInternalState(classObjectNameCreated,&#34; variableName&#34;);

提问,如果什么都不懂,我知道我不擅长!! :)