代码示例:
@ViewScoped
所以,现在如果我正在测试方法" A",:
OR
如果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是我创建的任何对象!
任何可能的解决方案?
答案 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;);
提问,如果什么都不懂,我知道我不擅长!! :)