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
构建一个mock
OuterClass
,而是创建了一个真实的类,似乎与我的
whenNew
指令相反。我不熟悉Mockito和PowerMock,我确信我缺少一些基本的东西。尽管如此,我还是试着从我能找到的每一个相关问题中找到解决方案,但没有一个有效。有人愿意帮忙吗?

您还需要准备任何创建您试图模拟的类的类。也就是说,您的注释应该是:

@PrepareForTest({
        OuterClass.class,
        OuterClass.FinalClass.class,
        TestClass.class})

你好,罗盖里奥,谢谢你的回复。我按照您的建议更新了@PrepareForest注释,但问题仍然存在。我更新了我的第一个问题。你好,看来你的思路是对的。我必须准备
OuterClass.class
,它构造了一个
OuterClass.FinalClass
对象,但我还必须准备
TestClass.class
,因为它构造了一个
OuterClass
对象。如果你更新你的答案,我会接受的。不确定Mockito具体是什么,但大多数代理和转换器不能与最终的类或方法一起工作。PowerMockito通过巧妙地操纵字节码来绕过这个限制。