模拟静态使用时的静态方法从其他方法

模拟静态使用时的静态方法从其他方法

问题描述:

代码示例称为powermockito:模拟静态使用时的静态方法从其他方法

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; 
} 


} 

所以,现在如果我测试方法“A”,:

  1. 时,它调用“connectA()方法”,我希望它返回,我想

OR

    01嘲笑对象
  1. 当“新B”叫我希望它返回一个嘲笑的对象,我想
  2. 它的工作原理,如果connectA()方法不是静态的,但我不知道如何使它使用,如果它的静态工作powermockito和

    的Mockito

    所以测试类将somethinng像:

    @RunWith(PowerMockRunner.class) 
    @PrepareForTest({A.class,B.class}) 
    public class ATest(){ 
        public void testMethodA(){ 
         PowerMockito.whenNew(B.class).withAnyArguments().thenReturn(BMock); 
         A a = new A(); 
         a.A(); 
        } 
    } 
    

    其中BMock是任何对象我创造!

    任何可能的解决方案?

开始=>

所以,这个问题的答案是,

当我这样做的模拟像这样:

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

然后在这里(“我的嘲笑字符串”)是用于对象的不同实例或我们可以说有不同的对象ID(如:a5Gbd @ ass)

但是实际上在方法B的构造函数中调用该方法时,会调用此变量作为“new”传入,该变量再次具有不同的对象id(例如:affac @ das),那么powermockito会认为m现在在构造函数中调用的方法,以及我们在嘲笑它时所指的方法 - 两者都不相同。

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

但我有一个解决这个问题,它会工作,如果你能够在两个地方通过相同的对象实例,这种方式powermockito知道我们正在尝试相同的方法。

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

一件事是帮我用powermockito访问私有变量,因此,如果有人需要它:

Whitebox.getInternalState(classObjectNameCreated, “VARIABLENAME”);

问问题,如果什么都不了解,我知道我不擅长它! :)

尝试添加

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

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

更新。

此代码对我的作品正确的(我加A类内吸)

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 很难理解你想要什么,以及你班上的逻辑是什么。所以只有你知道你的商业规则和注入的地方。相反,供应商可以使用工厂。但是关于使用工厂有一场“神圣的战争”。

+0

我试过使用mockStatic,它dosent工作! 我还没有使用com.google.inject,你能举个例子吗? –

+0

模拟静态只能工作,如果我直接从测试类调用静态方法,但现在当它被别的东西调用时! –

+0

有些东西很奇怪,因为你的代码在我的配置上正常工作,没有模糊不清。这意味着我给了a.getB()的正确模拟。 –