当前位置: 首页 > 知识库问答 >
问题:

使用testng、mockito和powermock模拟系统类的方法

崔单弓
2023-03-14

当我尝试使用mockito和powermock(在testng框架下使用)来模拟这些变量时,我遇到了一个问题

到目前为止我所做的

@BeforeClass
public void setup() {
    PowerMockito.mockStatic(System.class);
    PowerMockito.when(System.getenv("hello")).thenReturn("world");
}

@Test
public void test() {
    assertEquals(System.getenv("hello"), "world");
}

但是当我试图运行上面的代码时,我得到了以下错误:

>

  • 您使用以下任一方法存根:final/private/equals()/hashCode()方法。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。

    在when()中,您不是在mock上调用method而是在其他对象上调用method。

    所以我读到并看到这个错误是在试图用模拟类本身来模拟一个方法时产生的,但这里不是这样。

  • 共有1个答案

    左丘烨烁
    2023-03-14

    在玩弄了很长一段时间之后,下面是我如何做到这一点的。

    简单地说,为了使powermockito和TestNG能够相互协作,您必须执行以下操作(引用了下面共享的博客文章的链接,这样答案才是完整的,即使博客在以后的时间点不可用,也是有用的)

    >

  • 配置TestNG以使用PowerMock对象工厂:您可以通过套件xml的 标记中的属性object-factory或通过@org.TestNG.annotations.objectfactory带注释的方法执行此操作,该方法返回PowerMock对TestNG接口org.TestNG.iobjectfactory的实现,即org.PowerMock.modules.TestNG.powerMockobjectfactory

    使用@PrepareForTest准备静态类以供PowerMockito模拟

    更多详情请参阅本博客。

    下面是一个工作示例:

    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.testng.IObjectFactory;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.ObjectFactory;
    import org.testng.annotations.Test;
    
    import static org.testng.Assert.assertEquals;
    
    @PrepareForTest(System.class)
    public class SampleTestClass {
        @BeforeClass
        public void setup() {
            PowerMockito.mockStatic(System.class);
            PowerMockito.when(System.getenv("hello")).thenReturn("world");
        }
    
        @Test
        public void test() {
            assertEquals(System.getenv("hello"), "world");
        }
    
        @ObjectFactory
        public IObjectFactory getObjectFactory() {
            return new org.powermock.modules.testng.PowerMockObjectFactory();
        }
    
    }
    
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-testng</artifactId>
        <version>1.7.0</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.7.0</version>
        <scope>test</scope>
    </dependency>
    

  •  类似资料:
    • 问题内容: 我有这样的代码片段: 在运行此测试时,我得到: 你知道我该怎么预防吗?我也许还有另一种方法可以模拟这样的代码: 问题答案: 尝试将此注释添加到您的Test类: 为我工作。

    • 我想为我拥有的一个类编写一个单元测试。这个类有一个公共方法,在公共方法内部有对同一个类中的私有方法的调用。我想模拟对那些私有方法的调用。类与此类似: 对于我的单元测试,我尝试将PowerMock与Mockito和TestNG一起使用。下面是我对测试SomePublicMethod的测试的尝试: 当我运行这个测试时,我会得到一个异常和一些提示: 我在网上看了一些例子,但是我还没有找到一个专门使用Po

    • 我正在尝试使用JUnit、Mockito和PowerMock验证对的调用。 下面是我的测试用例: 下面是测试中的代码: 非常有趣的是,这段代码失败时出现:

    • 问题内容: 我有以下要模拟的Logger,但要验证是否正在调用日志条目,而不是内容。 我想模拟用于LoggerFactory.getLogger()的任何类,但是我找不到如何做到这一点。到目前为止,这是我最终得到的结果: 我想知道: 我可以模拟静态模型以用于任何课程吗? 我只能似乎运行的,因此我似乎无法改变每个方法的特点。有没有解决的办法? 编辑结果: 我以为我已经尝试过了,但没有成功: 但是,谢

    • 我有这样一个代码片段: 在运行这些测试时,我得到了: 你知道我该怎么阻止吗?我也许还有另一种方法来嘲弄这样一段代码: