模拟静态使用时的静态方法从其他方法
代码示例称为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”,:
- 时,它调用“connectA()方法”,我希望它返回,我想
OR
-
01嘲笑对象
- 当“新B”叫我希望它返回一个嘲笑的对象,我想
它的工作原理,如果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 很难理解你想要什么,以及你班上的逻辑是什么。所以只有你知道你的商业规则和注入的地方。相反,供应商可以使用工厂。但是关于使用工厂有一场“神圣的战争”。
我试过使用mockStatic,它dosent工作! 我还没有使用com.google.inject,你能举个例子吗? –
模拟静态只能工作,如果我直接从测试类调用静态方法,但现在当它被别的东西调用时! –
有些东西很奇怪,因为你的代码在我的配置上正常工作,没有模糊不清。这意味着我给了a.getB()的正确模拟。 –