【问题标题】:Powermock constructor mocking has no effect on the instantiated objectPowermock 构造函数模拟对实例化对象没有影响
【发布时间】:2013-03-13 00:34:11
【问题描述】:
    Class  A{

    B objB = new B();
    objB.someBMethod();

    }

    Class B{

    public void someBMethof(){

    C objC = new C();

    }
    }

    class C{
    int a=1;
    public C(){}
    public C(int v){
    a=v;
    }
    }

@RunWith( PoswerMockRunner.class )
@PrepareForTest({ A.class, B.class, C.class})
Class TestApp{

    @Mock
    C mockC;

    PowerMockito.whenNew( C.class ).withNoArguments().thenReturn(mockC);

}

上面的代码捕获了我想要做的事情。但是 whenNew() 似乎没有工作,当我尝试调试时,创建的 C 对象不是模拟的。不知道发生了什么。一些指针将不胜感激。谢谢

【问题讨论】:

    标签: java junit mockito stub powermock


    【解决方案1】:

    您提供了一些代码,谢谢。但是下一次,考虑发布一个 sscce(正确的(Compilable)示例)。

    我尝试过(并修复了您的代码)并且它有效。这是我的代码版本:

    public class A {
    
        public int someAMethod() {
            B objB = new B();
            return objB.someBMethod();
        }
    }
    
    public class B {
    
        public int someBMethod() {
            C objC = new C();
            return objC.getA();
        }
    }
    

    import static org.junit.Assert.assertEquals;
    import static org.mockito.Mockito.when;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.Mock;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    
    @RunWith(PowerMockRunner.class)
    @PrepareForTest({ A.class, B.class, C.class })
    public class TestApp {
    
        @Mock
        C mockC;
    
        @Test
        public void shoudlReturnTheCValue() throws Exception {
            when(mockC.getA()).thenReturn(666);
            PowerMockito.whenNew(C.class).withNoArguments().thenReturn(mockC);
            assertEquals(666, new A().someAMethod());
        }
    }
    

    我已经配置了一个具有以下依赖项的 maven 项目:

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.5</version>
        <scope>test</scope>
    </dependency>
    

    【讨论】:

    • 好的,我会进一步研究我做不同的地方。感谢您的回复,下次肯定会发布可编译的代码。一个问题是,如果传入的参数是通过匹配器完成的,而不是在实际运行时传递的确切值,我有时会看到 when() / whenNew() 类似的事情无法进行存根。您能告诉我在什么情况下预期实际值以及何时可以使用 mactchers?发生这种情况时我可以得到模式吗?
    • 你找到问题了吗?对不起,我不明白其他问题。也许你应该创建一个新问题来获得更多人的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2020-04-29
    • 2013-11-17
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多