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

在Java中使用PowerMock使用new模拟对象实例化不起作用

杜起运
2023-03-14

我正在尝试用Java对一个类进行单元测试。

public class ToBeTested {
    private Collaborator collaborator;

    public ToBeTested() {
        System.out.println("ToBeTested: Constructor");
    }

    public void start() {
        System.out.println("ToBeTested: Start");
        collaborator = new Collaborator();
    }
}

这个类ToBetested依赖于另一个类Collaborator

类的代码:Collaborator

public class Collaborator {

    Collaborator() {
        System.out.println("Collaborator: Constructor");
    }
}

在测试类ToBetested时,我希望将Collaborator实例化存根。这是一个我想模拟的依赖项,我不希望它的构造函数被调用。

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.annotation.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.powermock.api.easymock.PowerMock.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ToBeTested.class, Collaborator.class})
public class TestToBeTested {

    @Mock
    private Collaborator collaborator;

    private ToBeTested toBeTested;

    @Before
    public void setUp() throws Exception {
        collaborator = createMock(Collaborator.class);
        expectNew(collaborator.getClass()).andReturn(null);
        toBeTested = new ToBeTested();
    }

    @Test
    public void test() {
        replayAll();

        toBeTested.start();

        verifyAll();
    }

}

我的理解是,这将模拟或存根Collaborator,它的构造函数不应该被调用。但是,当我运行测试时,我注意到Collaborator的原始构造函数被调用。

试运行输出:

ToBeTested: Constructor
ToBeTested: Start
Collaborator: Constructor

我对Java和Java中的单元测试非常陌生,所以如果我在这里犯了一个非常基本的错误,我表示歉意。

    null

共有1个答案

司马羽
2023-03-14

它可能无法工作的一个可能原因可能是这一行:

expectNew(collaborator.getClass()).andReturn(null);

Collaborator是一个模拟实例,这意味着它的“getClass()”方法将返回Collaborator$CGlibMockedWithPowerMock或类似的东西--而不是您希望它是的Collaborator类。因此只需将该行更改为:

expectNew(Collaborator.class).andReturn(null);
 类似资料:
  • 尽管遵循了多种不同的资源,但我无法让PowerMock在新的时间工作。以下是我的示例: 我试图模拟构造函数,使其指向这样的点: 我做错什么了吗?我应该提到,我正在gradle项目中使用PowerMock。这似乎与https://automationrhapsody.com/mock-new-object-creation-powermock/,所以我不知道为什么它对我不起作用。

  • 它的实现DAO类类似于下面的一个。 我搜索了PowerMock/EasyMock文档,但我猜大多数API方法都提供了对象,这些对象为我提供了DAO接口的虚拟实现类。 > 是否有某种方法可以创建连接的模拟对象(假设我没有物理数据库访问权限),并可以运行类中提供的后续代码,因为我必须使用这种模拟来实现代码覆盖率?

  • 我有这门课(简体) 我试图模拟writeToFile方法,但没有成功 这个结果随着去到原来的方法,我也尝试了模拟具体的方法使用: 编辑:修复导入问题后,正如@pvpkiran所说,现在起作用了!我可以用DoAnswer来验证。

  • 问题内容: 我试图遵循这个非常相似的问题的答案中提供的示例,但是它对我不起作用。我收到以下错误消息: 我需要一个简单的模拟实例。我不需要模拟任何方法。 这是我要模拟的课程: 我有以下TestNG设置: 问题答案: 我通过扩展PowerMockTestCase类来完成这项工作,该类为TestNG处理此类事情:

  • 我需要卸载一个静态方法 public TestESMock()引发ConfigurationException{ 有人能告诉我怎么做吗。

  • 我是Java的新手,我已经开发了一个程序,允许用户输入他的in-and结果,还可以看到这两个结果的摘要(第二个代码示例)。 我使用文本文件存储数据(第一个示例)。我为每个用户使用两个文本文件,一个用于收入,一个用于结果。 下面的代码示例总结了用户的in-和结果(注意:opnEsoda是一个扫描器): 这会显示:你得到67欧元 我的目标是把这周和这个月花的钱拿出来。我还想知道每一个类别(可选)的花费