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

单个测试类的模拟生成器

仇建茗
2023-03-14

我有一个有很多测试文件的项目。在其中一个测试类中,我需要模拟最终类。正如我发现它可以通过MockMaker(link)完成,但是这破坏了我的所有其他测试类,原因如下:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);

没有模拟生成器,所有其他测试都可以。

如何指定仅在单个测试类上使用MockMaker?

共有2个答案

厉成仁
2023-03-14

不能基于此链接模拟最终类:https://github.com/mockito/mockito/wiki/FAQ#what-莫基托的局限性是什么

请参阅以下链接:

如何用mockito模拟最后一个类

如何用mockito模拟最后一个类

尝试按如下方式使用电源:

public final class Plane {
    public static final int ENGINE_ID_RIGHT = 2;
    public static final int ENGINE_ID_LEFT = 1;

    public boolean verifyAllSystems() {
        throw new UnsupportedOperationException("Fail if not mocked!");
    }

    public void startEngine(int engineId) {
        throw new UnsupportedOperationException(
                "Fail if not mocked! [engineId=" + engineId + "]");
    }
}

public class Pilot {
    private Plane plane;

    public Pilot(Plane plane) {
        this.plane = plane;
    }

    public boolean readyForFlight() {
        plane.startEngine(Plane.ENGINE_ID_LEFT);
        plane.startEngine(Plane.ENGINE_ID_RIGHT);
        return plane.verifyAllSystems();
    }
}

并测试最终类:

@PrepareForTest(Plane.class)
public class PilotTest extends PowerMockTestCase {
    @Test
    public void testReadyForFlight() {
        Plane planeMock = PowerMockito.mock(Plane.class);
        Pilot pilot = new Pilot(planeMock);

        Mockito.when(planeMock.verifyAllSystems()).thenReturn(true);

        // testing method
        boolean actualStatus = pilot.readyForFlight();

        Assert.assertEquals(actualStatus, true);
        Mockito.verify(planeMock).startEngine(Plane.ENGINE_ID_LEFT);
        Mockito.verify(planeMock).startEngine(Plane.ENGINE_ID_RIGHT);
    }
}

示例链接:https://dzone.com/articles/mock-final-class

段干俊茂
2023-03-14

尝试使用PowerMockito。。它能很好地处理期末考试和静力学:

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.6.5</version>
    <scope>test</scope>
</dependency>

模仿最后一节课:

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({MyFinalClass.class})
public class MyTest {

    @Test
    public void myFinalClassTest() {
        MyFinalClass finalMock= PowerMockito.mock(MyFinalClass .class);


        Mockito.when(finalMock.toString()(testInput)).thenReturn("abc");

        // Assertions            
    }

}

您只能在需要时使用此功能。。在所有其他地方,您可以保留原始的Mockito用法。

 类似资料:
  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 我用Mockito进行了Java测试: Kotlin.TypeCastException:null不能强制转换为非null类型java.util.HashMap 如何正确模拟属性?

  • 我很困惑于嘲笑如何对实现进行单元测试。问题是我想嘲笑不同的预期行为。 有没有办法做到这一点?由于导入只能在文件的顶部,并且为了能够模拟某些内容,必须在导入之前声明它。我也试图传递一个本地函数,这样我就可以覆盖行为,但jest抱怨你不允许传递任何本地的东西。 在内部,可以想象使用

  • 所以我有三个类:A、B、C。我需要为类编写单元测试。 因此,C是一种重要的资源(如JDBC或ssh会话)。当然,我在嘲笑C。如何模拟B。想象一下,B有许多扩展它的子类。 我的主要问题是A正在调用super。(...) 。我不想仅仅为了测试而将方法注入到A中。对我来说,这是个糟糕的设计。有没有办法嘲笑父母? 例如,我不能执行类MockB扩展B{…} 然后尝试

  • 我目前正在与CDI Unit合作一个项目,我遇到了一个奇怪的问题。我试图在一个简单的项目中重现它: 我有一个使用CdiRunner运行的测试类(如下所述:http://jglue.org/cdi-unit-user-guide/我的测试类注入了被测试的单元:UUD。这个类扩展了一个超级类“ParentTestClass”,它目前是无用的。 测试课。爪哇: 正如我提到的,父类是空的。 ParentT

  • spring bean xml 有几个使用真实对象预先编写的测试用例。有没有办法我可以模拟这个类B,得到注入类A和模拟几个方法?我只想在我的测试用例中这样做,以便预先编写的测试用例不受影响?