Java 在TestNG的@BeforeMethod上声明Jmockit模拟参数

Java 在TestNG的@BeforeMethod上声明Jmockit模拟参数,java,testng,jmockit,Java,Testng,Jmockit,我已经使用TestNG和JMockit测试了我的代码行为有一段时间了,我对它们的组合没有任何具体问题。今天我遇到了一种情况,我需要以所谓的类型范围的方式模拟我的一个内部依赖项,我不需要保留这种模拟,因为没有任何测试用例直接处理它,而它们依赖于模拟版本功能。因此,自然地,我将模拟逻辑放在我的@beforethod中。以下是一个示例: public class SampleTest { @Mocked @Cascading private InnerDependency de

我已经使用
TestNG
JMockit
测试了我的代码行为有一段时间了,我对它们的组合没有任何具体问题。今天我遇到了一种情况,我需要以所谓的类型范围的方式模拟我的一个内部依赖项,我不需要保留这种模拟,因为没有任何测试用例直接处理它,而它们依赖于模拟版本功能。因此,自然地,我将模拟逻辑放在我的
@beforethod
中。以下是一个示例:

public class SampleTest
{
    @Mocked
    @Cascading
    private InnerDependency dependency;

    @BeforeMethod
    public void beforeMethod()
    {
        new NonStrictExpectations()
        {
            {
                dependency.getOutputStream((String)any);
                result = new Delegate<OutputStream>()
                {
                    public OutputStream getOutputStream(String url)
                    {
                        return null;
                    }
                };
            }
        };
    }

    @Test
    public void testNormalOperation()
    {
        // The test whose desired behavior depends on dependency being mocked out
        // ..
    }
}
  • 依赖项
    声明为
    beforeMethod()
    的输入参数,类似于对普通
    @Test
    方法所做的操作:

    @BeforeMethod
    public void beforeMethod(@Mocked @Cascading final InnerDependency dependency)
    {
       // ...
    }
    
  • 我看到JMockit 1.6+不喜欢第一个选项,并用
    警告:本地模拟字段“dependency”应移动到测试类或转换为测试方法的参数。因此,为了让每个人都开心,我排除了这个选项

    但是对于第二个选项,
    TestNG
    (当前为6.8.6)在运行测试时抛出异常,并说
    java.lang.IllegalArgumentException:参数数错误
    。我没有看到正常的
    @Test
    案例通过
    @mock
    参数时出现这种行为。即使使用
    @参数
    @可选
    也没有帮助(而且不应该有!)

    那么,我有没有办法在不声明不必要的测试类模拟字段的情况下完成这项工作,或者我在这里遗漏了什么

    感谢

    只有测试方法(在JUnit或TestNG中用
    @test
    注释)支持模拟参数,因此这里唯一的选择是在测试类级别声明模拟字段


    即使没有在任何测试方法中使用,我认为它也比在设置方法中声明好(使用
    @Before
    @beforethod
    ,等等)。如果有可能,由于设置方法的性质,模拟仍然必须应用于所有测试;拥有测试类的mock字段可以明确mock的范围。

    是在本地指定@Mocked依赖项的另一种技术。然而,它也有它的局限性(见下面的评论)。

    这是TestNG的局限性吗?这可能是JMockit将来的一个功能吗?不,这是JMockit的一个设计选择。可以使用动态部分模拟,但正如文档所述,它有局限性:
    如果传递了给定类的类对象,则会考虑该类中定义的方法和构造函数进行模拟,但不是它的超类的方法和构造函数。
    在我的例子中,我无法访问内部依赖项以将其注入(它被深深地埋藏了),并且使用类类型也不能提供我所需要的。传递实例是否适合您<代码>如果传递了给定类的实例,则整个类层次结构中定义的所有方法,从给定实例的具体类到(但不包括)对象,都将被视为模拟;但是,这些类的构造函数不是(因为已经创建了实例)。
    @BeforeMethod
    public void beforeMethod(@Mocked @Cascading final InnerDependency dependency)
    {
       // ...
    }