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

如何设置Mock有一个默认的行为,并可以在一些测试中覆盖它

幸经艺
2023-03-14

我想模拟一个依赖项,并在大多数测试用例中返回一个默认值,因为大多数测试用例都不应该关心返回的值,但是有些特定的情况下,我想测试,比如依赖项返回一些奇怪的值,或者只是抛出。所以我用这种方式来建模。大多数情况下,它应该返回一个好的有效值。

测试设置,默认情况下为所有测试类返回20L

Dependency dependency = Mockito.mock(Dependency.class);
when(dependency.returnSomeVal()).thenReturn(20L);

在特定的测试用例类中,我想重写如下行为:

when(dependency.returnSomeVal()).thenThrow(); //failure cases
when(dependency.returnSomeVal()).thenReturn(Weird_Val); //failure cases

但是我没有找到一个好的解决方案来覆盖现有的行为?任何想法?

共有2个答案

郗丰
2023-03-14

最后,我用自己的这种模式模拟了一个类中提供配置的一组方法。

在一个方法中,我为一个模拟对象设置了一组存根,这些存根为每个测试提供了正确的配置。之后,在每个测试中,只重写其中一个存根以提供不同的配置和测试不同的错误情况是非常方便的。

我认为Hari Menon的回答是正确的,但不知何故它违背了问题中解释的目的。如果重置模拟,则需要再次添加所有存根,这使得此模式非常混乱(与使用重置相比,最好不要使用任何重写,在这种情况下,代码将更加简单)。

添加到问题中的评论确实提供了一个间接的答案,说明了如何实现这一点,以及它为什么会起作用,但我花了一点时间才让它起作用。

尽管有一条评论,我还是通过在@Before fixture when()中使用,使一切正常。然后返回()并用doReturn()覆盖混凝土桩。当()

例子:

public class WorkerTest {

    private ConfigProvider mockedConfigProvider = mock(ConfigProvider.class);

    @Before
    public void setup() {
    // Setup stubs with a correct config
        when(mockedConfigProvider.getValue("property1")).thenReturn("value1");
        when(mockedConfigProvider.getValue("property2")).thenReturn("value2");
        when(mockedConfigProvider.getValue("property3")).thenReturn("value3");
        when(mockedConfigProvider.getValue("property4")).thenReturn("value4");
    }

    @Test
    public void test_GoodConfig(){
        // The config object gets injected in the test worker
        Worker testWorker = new Worker(mockedConfigProvider);
        // testWorker.execute() returns true if everything went well
        assertTrue(testWorker.execute());
    }

    @Test
    public void test_BadConfigProp1(){
        // Test now with a broken 'property1', overriding that stub.
        doReturn(null).when(mockedConfigProvider).getValue("property1");
        Worker testWorker = new Worker(mockedConfigProvider);
        // testWorker.execute() returns false if there is a problem.
        assertFalse(testWorker.execute());
    }

    @Test
    public void test_BadConfigProp2(){
    // This test needs to only override the result of property2
    doReturn("crazy result").when(mockedConfigProvider).getValue("property2");
    ...

}
罗诚
2023-03-14

您可以重置模拟和添加行为。在测试中,你要做什么

Mockito.reset(dependency);
when(dependency.returnSomeVal()).thenThrow(); //failure cases
when(dependency.returnSomeVal()).thenReturn(Weird_Val); //failure cases

重置将删除这个类上的所有模拟行为。如果您想只重写一些方法,那么您必须从头开始创建模拟。

 类似资料:
  • 问题内容: 请参阅以下Maven生成的项目 我想 在运行测试 时使用test / resources / datasource-settings.xml中的设置,而不要使用main / resources / datasource-settings.xml中的设置。可能吗 ?如果是这样,我应该怎么做才能达到目标? 问题答案: 放置在(默认位置)中的资源将自动添加到Maven为您的单元测试设置的类路

  • 我有一个RESTAPI,我不想强迫客户端发送请求参数。我有将近400个api方法,我不想将所有参数设置为“required=false” 我想覆盖Spring RequestParam的默认行为。我想将RequestParam接口的“required”属性的默认值设置为“false”。 有什么方法可以覆盖它吗?如果我不能或这不是最佳实践,有什么方法可以解决上述问题。

  • 问题内容: 默认情况下,chrome将使用以下命令行运行: 我需要重写(删除)所有命令,因为没有等效命令。 最后,我要使用以下命令行运行浏览器: 例如,我尝试使用翻译信息栏运行浏览器。我找到了选择。 但这没有帮助,信息栏不会出现。在命令行中,有两个命令:和。这是因为有必要删除该命令 问题答案: 您应该 自己启动浏览器 ,然后告诉selenium,您已经通过 传递特殊通道id 启动了它。像这样:

  • 我想在测试中重写Application.properties中定义的属性,但@TestPropertySource只允许提供预定义的值。 我需要的是在一个随机端口N上启动一个服务器,然后将这个端口传递给spring-boot应用程序。端口必须是短暂的,以允许在同一主机上同时运行多个测试。 我指的不是嵌入式http服务器(jetty),而是在测试开始时启动的一些不同的服务器(例如zookeeper)

  • 我需要定制的工件安装,不知道如何覆盖默认的(从默认的maven生命周期)。所以我的问题是: 如何在我的pom.xml中配置maven install插件,使其不进行默认安装并执行我的自定义安装文件目标? 我尝试了没有id和默认安装id,但没有帮助。 更新:从提供的答案 - 这对我不起作用(我在日志中看到两次安装尝试)。

  • 对不起我的英语。我对junit测试有问题。客户机要求覆盖所有类,即使是dto/model/entity(即使是错误的,我也必须这样做)。但我在测试getter和setter时遇到困难。我无法覆盖,我已经测试了许多解决方案,但要么覆盖率为0,要么出现错误,我该怎么办? 我的班级: 我的班级测试 always error,例如last when:when()需要的参数必须是“模拟的方法调用”。例如:w