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

使用Mockitos传递参数化输入

法浩壤
2023-03-14

我使用Mockito进行单元测试。我想知道是否可以发送参数化输入参数,如JUnit测试
例如

@InjectMocks
MockClass mockClass = new MockClass();

@Test
public void mockTestMethod()
    {
    mockClass.testMethod(stringInput); 
// here I want to pass a list of String inputs 
// this is possible in Junit through Parameterized.class.. 
// wondering if its can be done in Mockito
    } 

共有3个答案

贺自明
2023-03-14

您可以使用JUnitParamsRunner。我是这样做的:

import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;

import java.util.Arrays;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;

@RunWith(value = JUnitParamsRunner.class)
public class ParameterizedMockitoTest {

    @InjectMocks
    private SomeService someService;
    @Mock
    private SomeOtherService someOtherService;

    @Before
    public void setup() {
        initMocks(this);
    }

    @Test
    @Parameters(method = "getParameters")
    public void testWithParameters(Boolean parameter, Boolean expected) throws Exception {
        when(someOtherService.getSomething()).thenReturn(new Something());
        Boolean testObject = someService.getTestObject(parameter);
        assertThat(testObject, is(expected));
    }

    @Test
    public void testSomeBasicStuffWithoutParameters() {
        int i = 0;
        assertThat(i, is(0));
    }

    public Iterable getParameters() {
        return Arrays.asList(new Object[][]{
                {Boolean.TRUE, Boolean.TRUE},
                {Boolean.FALSE, Boolean.FALSE},
        });
    }
}
史鹏云
2023-03-14

如果您使用的是旧版本的mockito,而MockitoRule不可用,那么另一种可能是使用MockitoAnnotations显式初始化mock。initMocks

@RunWith(Parameterized.class)
public class YourComponentTest {        
    @Mock YourDep mockYourDep;

    @Parameter
    public Parameter parameter;

    @Parameters public static Collection<Object[]> data() { /* Return the values */ }

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test public void test() { /* Use the field value in assertions */ }
}
齐冥夜
2023-03-14

在JUnit中,参数化测试使用一个特殊的运行程序来确保测试被多次实例化,因此每个测试方法都被多次调用。Mockito是一个用于编写特定单元测试的工具,因此没有内置的能力以不同的Mockito期望多次运行同一测试。

如果要更改测试条件,最好执行以下操作之一:

  • 使用JUnithtml" target="_blank">参数化您的测试,为您想要的模拟输入提供一个参数

请注意,不禁止将模拟对象用作参数化的测试参数。如果您希望基于mock进行参数化,那么您可以这样做,可以创建mock并在测试的静态方法中设置期望值。

关于运行程序的注意:此参数化测试运行程序与Mockito的MockitoJUnitRunner冲突:每个测试类只能有一个运行程序。如果您同时使用之前和之后方法或Mockito JUnit4规则,您将希望切换到它们。

例如,从不同的答案中压缩,该答案解释了更多关于参数化运行程序与JUnit规则的信息,并从JUnit4参数化测试文档页和MockitoLaw文档页中提升:

@RunWith(Parameterized.class)
public class YourComponentTest {
    @Rule public MockitoRule rule = MockitoJUnit.rule();
    @Mock YourDep mockYourDep;

    @Parameters public static Collection<Object[]> data() { /* Return the values */ }

    public YourComponentTest(Parameter parameter) { /* Save the parameter to a field */ }

    @Test public void test() { /* Use the field value in assertions */ }
}
 类似资料:
  • 问题内容: 我正在使用Mockito进行单元测试。我想知道,如果可能与在JUnit进行测试发送参数化的输入参数, 如 问题答案: 在JUnit中,参数化测试使用特殊的运行器,以确保多次实例化该测试,因此每种测试方法均被多次调用。Mockito是用于编写特定单元测试的工具,因此没有内置功能可以以不同的Mockito期望多次运行同一测试。 如果要更改测试条件,最好的选择是执行以下一项操作: 使用JUn

  • 问题内容: 这是我的 angularroute.html Route.js文件包含。 Route1.html 问题是它加载了页面,但我无法在route1.html上接收到获取参数值,表达式也未得到求值。可能是什么问题呢?谢谢。 问题答案: 从路线模板中删除不需要的所有内容。只需要您在模板正文中添加的内容。 这将包含在您在路线中配置的控制器的ng-view中。这是部分而不是完整的html文件。 另外

  • 您可以将其他数据作为常规方法参数传递到后台任务。我再次使用下面的例子(希望没有让你厌恶): BackgroundJob.Enqueue(() => Console.WriteLine("Hello, {0}!", "world")); 在常规方法调用中,在执行后台作业期间, Console.WriteLine 方法将使用这些参数。为了参数传递进去,需要先序列化。 使用 了不起的 Newtonsof

  • 问题内容: 在SQL Server 2014中,我试图创建一个动态的WHERE子句。 我已将查询构建为字符串,但是当我尝试使用sp_executesql执行查询时,出现以下错误:提示 13您必须声明标量变量“ @desde”。 我不知道如何使sp_executesql识别输入参数。 问题答案: 代替 使用 您必须定义在动态查询中使用的参数,例如 请参考sp_executesql 否则,您可以将动态

  • 问题内容: 我在传递带有ajax url的参数时遇到问题。我认为错误在于参数代码语法。请帮助。 我正在按以下方式访问这些参数 问题答案: 为什么要结合GET和POST?使用一个或另一个。 的PHP: 或者,只需正确格式化您的请求即可(您缺少get参数的“&”号)。

  • 尽管应用中的大部分组件都依赖其他组件,但并不总是如此。同时 Windsor 用来查找满足依赖的正确组件的默认规则有时不得不进行调整。 如何做到这一点基于值的来源和获取值的地方。 Composition root - container.Resolve container.Resolve 方法有几个重载允许传递 IDictionary 作为参数(在这种情况下,建议使用 [Arguments] 类),