JMockit返回集合

时间:2010-06-03 08:16:19

标签: jmockit

我有以下代码:

public void someMethod() {
     Set<Foo> fooSet = bar.getFoos();

     for(Foo foo: fooSet) {
         foo.doSomething();
     }
}

我希望使用JMockit对此进行测试,但我不确定如何返回某种类型和大小的集合。

当我尝试将foo添加到foos集时,我的代码的以下测试会抛出hashcode的空指针异常。

@Test
public void someTestMethod()
{
     new Expectations()
     {
         @Mocked Bar bar;
         @Mocked Foo foo;


         Set<Foo> foos = new HashSet<Foo>();
         foos.add(foo);

         bar.getFoos(); returns(foos);
         foo.doSomething();
     };

     new SomeClass().someMethod();
}

应该怎么做?

1 个答案:

答案 0 :(得分:3)

我不确定如何回答你的问题,因为我不明白你要测试的是什么,但我相信你想要这样的东西:

@Test
public void someTestMethod(@Mocked(methods="getFoos")final Bar mockedBar
                           @Mocked(methods="doSomething")final Foo mockedFoo {

   final Set<Foo> foos = new HashSet<Foo>();
   foos.add(new Foo()); 

   new Expectations() {
      {
         mockedBar.getFoos(); returns(foos);
         mockedFoo.doSomething();
      }
   };

   new SomeClass().someMethod();
}

使用此功能,JMockit将模拟对getFoos的调用并返回Set foos。如果你查看我传入的参数,我正在对Bar和Foo类进行部分模拟(我只是模拟对getFoos和doSomething方法的调用)。我还注意到你在new Expectations区块中缺少一组括号,这肯定会给你带来一些问题。您必须记住的另一个问题是,如果您在Set foos中放置多个对象,则使用Expectations而非NonStrictExpectations将导致错误,因为它只期望一次调用doSomething。如果您创建一个foos中有多个对象的测试用例,您可以使用NonStrictExpectations或使用minTimes和maxTimes来指定调用计数约束