Java PowerMockito:测试是构建真实的对象,而不是模拟,无论何时
我想测试以下课程:Java PowerMockito:测试是构建真实的对象,而不是模拟,无论何时,java,junit,mockito,powermock,Java,Junit,Mockito,Powermock,我想测试以下课程: public class TestClass { private OuterClass client; public TestClass(int v1, String v2){ this.client = new OuterClass.FinalClass(v1, v2).build(); } public boolean doAThing(){ return this.client.respond();
public class TestClass {
private OuterClass client;
public TestClass(int v1, String v2){
this.client = new OuterClass.FinalClass(v1, v2).build();
}
public boolean doAThing(){
return this.client.respond();
}
}
我使用的外部库类似于:
public class OuterClass{
private int var1;
private String var2;
private OuterClass(int v1, String v2){
this.var1 = v1;
this.var2 = v2;
}
public static final class FinalClass{
private int v1;
private String v2;
public FinalClass(int v1, String v2){
this.v1 = v1;
this.v2 = v2;
}
public OuterClass build(){
return new OuterClass(this.v1, this.v2);
}
}
public boolean respond(){
throw new IllegalStateException("I'm real and shouldn't be!");
}
}
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({OuterClass.class, OuterClass.FinalClass.class})
public class TestTest {
@Test
public void test() throws Exception{
PowerMockito.mockStatic(OuterClass.FinalClass.class);
OuterClass.FinalClass mockFinal =
PowerMockito.mock(OuterClass.FinalClass.class);
OuterClass mockOuter = PowerMockito.mock(OuterClass.class);
PowerMockito.whenNew(OuterClass.FinalClass.class)
.withAnyArguments()
.thenReturn(mockFinal);
PowerMockito.when(mockFinal.build()).thenReturn(mockOuter);
Mockito.when(mockOuter.respond()).thenReturn(true);
TestClass t = new TestClass(1, "HALP");
assertTrue(t.doAThing());
}
}
我的测试代码如下所示:
public class OuterClass{
private int var1;
private String var2;
private OuterClass(int v1, String v2){
this.var1 = v1;
this.var2 = v2;
}
public static final class FinalClass{
private int v1;
private String v2;
public FinalClass(int v1, String v2){
this.v1 = v1;
this.v2 = v2;
}
public OuterClass build(){
return new OuterClass(this.v1, this.v2);
}
}
public boolean respond(){
throw new IllegalStateException("I'm real and shouldn't be!");
}
}
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({OuterClass.class, OuterClass.FinalClass.class})
public class TestTest {
@Test
public void test() throws Exception{
PowerMockito.mockStatic(OuterClass.FinalClass.class);
OuterClass.FinalClass mockFinal =
PowerMockito.mock(OuterClass.FinalClass.class);
OuterClass mockOuter = PowerMockito.mock(OuterClass.class);
PowerMockito.whenNew(OuterClass.FinalClass.class)
.withAnyArguments()
.thenReturn(mockFinal);
PowerMockito.when(mockFinal.build()).thenReturn(mockOuter);
Mockito.when(mockOuter.respond()).thenReturn(true);
TestClass t = new TestClass(1, "HALP");
assertTrue(t.doAThing());
}
}
我希望这个测试能通过,但它却以一个非法的例外而失败。它似乎不像我所期望的那样,从一个mock
FinalClass
构建一个mockOuterClass
,而是创建了一个真实的类,似乎与我的whenNew
指令相反。我不熟悉Mockito和PowerMock,我确信我缺少一些基本的东西。尽管如此,我还是试着从我能找到的每一个相关问题中找到解决方案,但没有一个有效。有人愿意帮忙吗?您还需要准备任何创建您试图模拟的类的类。也就是说,您的注释应该是:
@PrepareForTest({
OuterClass.class,
OuterClass.FinalClass.class,
TestClass.class})
你好,罗盖里奥,谢谢你的回复。我按照您的建议更新了@PrepareForest注释,但问题仍然存在。我更新了我的第一个问题。你好,看来你的思路是对的。我必须准备
OuterClass.class
,它构造了一个OuterClass.FinalClass
对象,但我还必须准备TestClass.class
,因为它构造了一个OuterClass
对象。如果你更新你的答案,我会接受的。不确定Mockito具体是什么,但大多数代理和转换器不能与最终的类或方法一起工作。PowerMockito通过巧妙地操纵字节码来绕过这个限制。