Java 模拟方法作为另一种方法的参数

Java 模拟方法作为另一种方法的参数,java,mocking,easymock,Java,Mocking,Easymock,我在测试具体方法(操作实例中的iffunction)被调用多少次时遇到了一个问题 根据: 我写道: class Operation{ public double[] calculateSth(IFunction function, int [] t){ for(int i=0 ; i<5 ; i+=1) function(t, new int[]{1,2,3}); return new double[]{1,2,3}; } }

我在测试具体方法(操作实例中的iffunction)被调用多少次时遇到了一个问题

根据:

  • 我写道:

    class Operation{
       public double[] calculateSth(IFunction function, int [] t){
          for(int i=0 ; i<5 ; i+=1)
              function(t, new int[]{1,2,3});
    
       return new double[]{1,2,3};
       }
    
    }
    
    interface IFunction{
       double f(int[] a, int[]b);
    }
    
    class ConcreteF implements IFunction{
       double f(int[]a, int[]b){
           return 5;
       }
    }
    
    结果: java.lang.NullPointerException

    at org.easymock.internal.Injector.injectMocks(Injector.java:80)
    at org.easymock.EasyMockSupport.injectMocks(EasyMockSupport.java:624)
    at org.easymock.EasyMockRunner.withBefores(EasyMockRunner.java:50)
    

    这是我第一次使用easymock,我不知道如何修复它/

    我将回答这个问题,而不讨论原始方法是否有用的细节(代码甚至不编译),更不用说测试方法了

    @TestSubject操作op

    这条线是可疑的。我知道您正在
    @Before
    annotated
    setUp
    方法中实例化它,但是它看起来像
    Easymock
    尝试在它做任何事情之前注入Mock(用
    @Mock
    注释的那些Mock),并且由于此时的引用是
    null而爆炸

    v3.2
    中引入的注释支持也被视为一种消除对
    setUp
    方法需求的方法。但你似乎把两者混用了,而且用错了。选择其中一个-我建议您使用注释

    引用
    Easymock
    (本用户指南非常好,因此请务必在使用库之前阅读本指南)

    运行程序在步骤1实例化
    mock
    。然后由 在步骤2上,将运行程序发送到
    侦听器
    字段。
    设置
    方法可以 已删除,因为所有初始化都是由运行程序完成的


    我将回答这个问题,而不会详细讨论原始方法是否有用(代码甚至不会编译),更不用说测试方法了

    @TestSubject操作op

    这条线是可疑的。我知道您正在
    @Before
    annotated
    setUp
    方法中实例化它,但是它看起来像
    Easymock
    尝试在它做任何事情之前注入Mock(用
    @Mock
    注释的那些Mock),并且由于此时的引用是
    null而爆炸

    v3.2
    中引入的注释支持也被视为一种消除对
    setUp
    方法需求的方法。但你似乎把两者混用了,而且用错了。选择其中一个-我建议您使用注释

    引用
    Easymock
    (本用户指南非常好,因此请务必在使用库之前阅读本指南)

    运行程序在步骤1实例化
    mock
    。然后由 在步骤2上,将运行程序发送到
    侦听器
    字段。
    设置
    方法可以 已删除,因为所有初始化都是由运行程序完成的

    at org.easymock.internal.Injector.injectMocks(Injector.java:80)
    at org.easymock.EasyMockSupport.injectMocks(EasyMockSupport.java:624)
    at org.easymock.EasyMockRunner.withBefores(EasyMockRunner.java:50)
    
    @RunWith(EasyMockRunner.class) 
    public class ExampleTest {
    
      @TestSubject 
      private ClassUnderTest classUnderTest = new ClassUnderTest(); // 2 
    
      @Mock 
      private Collaborator mock; // 1 
    
      @Test 
      public void testRemoveNonExistingDocument() { 
        replay(mock); 
        classUnderTest.removeDocument("Does not exist"); 
      } 
    }