JMockit基础:模拟对象,模拟参数,期望

时间:2014-09-17 16:39:29

标签: jmockit

我刚刚开始使用JMockit,我对JMockit的一些基础知识有点困惑,在创建模拟对象的时候,模拟对象范围以及模拟的效果等等。请帮助解决以下问题。

我的问题参考以下代码:

public class MyClassTest
{
    @Mocked({"method1","method2"})
    ClassA classA;  //ClassA has only static method

    @Mocked
    ClassB classB;

    @Test
    public void test1()
    {
        new NonStrictExpectations() {{
            MyClassA.method3(classB);
            result = xxx;
        }};

        // testing code
        ....

        // verification
        ...
    }

    @Test
    public void test2(@Mocked ClassC classC)
    {
        ...
    }
}

问题:

  1. 关于@Mocked声明为junit测试的实例变量,如@Mocked ClassB classB:
  2. (1)对于junit,为每个测试新建一个实例变量(如test1(),test2()),对吧?在每次测试运行之前,是否都会创建一个新的ClassB实例?

    (2)嘲笑班级。它使ClassB中的所有方法都被模拟为所有测试(在这种情况下为test1()和test2()),对吗?

    (3)如果为模拟对象指定了方法,例如“@Mocked({”method1“,”method2“})ClassA classA;”,这意味着只能模拟method1和method2?是否可以添加其他方法在Expectations for a test中进行模拟?

    1. 关于传入测试的@Mocked参数,例如test2的“@Mocked ClassC classC”:
    2. 我认为这个模拟不应该影响其他测试?是不是ClassC只在test2()中被模拟?

      1. 期望:
      2. (1)对于测试中指定的期望,其范围是测试的局部范围,这意味着模拟方法仅在此测试中有效吗?例如,ClassA.method3()仅在test1()中模拟,对吧?

        (2)期望中记录的方法仅在从测试代码调用匹配方法时运行,是吗?如果记录的方法参数不匹配,它会运行实际方法吗?

        运行test1()时,我在ClassA.method3()中遇到异常。不知怎的,ClassA.method3()的真正方法被执行并给出了异常。我想这是由于ClassA.method3()的参数不匹配?

1 个答案:

答案 0 :(得分:1)

回答你的问题:

  1. (1)是; (2)是; (3)是的,其他方法不能在同一个测试类中嘲笑。

  2. 是的,仅适用于具有模拟参数的测试。

  3. (1)对,期望仅在其记录的范围内有效。 (2)不,一旦被嘲笑,方法的真正实现永远不会被执行。

  4. 至于你获得的例外,我无法在没有完成测试的情况下告诉它为什么会发生。