Java 模拟方法作为另一种方法的参数
我在测试具体方法(操作实例中的iffunction)被调用多少次时遇到了一个问题 根据: 我写道: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}; } }
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
annotatedsetUp
方法中实例化它,但是它看起来像Easymock
尝试在它做任何事情之前注入Mock(用@Mock
注释的那些Mock),并且由于此时的引用是null而爆炸
v3.2
中引入的注释支持也被视为一种消除对setUp
方法需求的方法。但你似乎把两者混用了,而且用错了。选择其中一个-我建议您使用注释
引用Easymock
(本用户指南非常好,因此请务必在使用库之前阅读本指南)
运行程序在步骤1实例化mock
。然后由
在步骤2上,将运行程序发送到侦听器
字段。设置
方法可以
已删除,因为所有初始化都是由运行程序完成的
我将回答这个问题,而不会详细讨论原始方法是否有用(代码甚至不会编译),更不用说测试方法了
@TestSubject操作op代码>
这条线是可疑的。我知道您正在@Before
annotatedsetUp
方法中实例化它,但是它看起来像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");
}
}