1

我有以下代码:

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

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

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

当尝试将 foo 添加到 foos 集合时,我的代码的以下测试会引发哈希码的空指针异常。

@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();
}

这应该怎么做?

4

1 回答 1

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 中,则使用 E​​xpectations 而不是 NonStrictExpectations 将导致错误,foos因为它只期望一次调用doSomething. 如果您制作一个foos包含多个对象的测试用例,您可以使用 NonStrictExpectations 或使用 minTimes 和 maxTimes 来指定调用计数约束

于 2010-06-11T13:42:08.913 回答