Java 如何初始化模拟对象?

Java 如何初始化模拟对象?,java,unit-testing,junit,mocking,easymock,Java,Unit Testing,Junit,Mocking,Easymock,假设我有以下代码: 模拟对象类 public class SomeClass { private Foo someField; public SomeClass { someField = new Foo(); } public Foo getSomeField { return someField; } public void getSomething() {} public boolean doSomething(Object

假设我有以下代码:
模拟对象类

public class SomeClass {
    private Foo someField;
    public SomeClass {
        someField = new Foo();
    }
    public Foo getSomeField { return someField; }
    public void getSomething() {}
    public boolean doSomething(Object object) {}
}
接下来我有测试套件

public class TestSuite {
    private ClassToTest classToTest;
    private SomeClass mock;

    @Before
    public void setUp() {
        classToTest = new ClassToTest();
        mock = EasyMock.createMock(SomeClass.class);
    }

    @Test
    public void testMethod() throws Exception { 
        mock.getSomething();
        EasyMock.replay(mock);

        classToTest.methodToTest(mock); //Where methodToTest accepts SomeClass and int

        EasyMock.verify(mock);
    }
}
和正在测试的方法

public void methodToTest(SomeClass a) {
    //Logic here
    Foo b = a.getSomeField();
    b.do(); // <--- null pointer exception here because someField isn't initialized
    a.getSomething(); // <--- thing I want to test if it is being called, but can't due to exception prior to this line
    //Logic after
}
public void methodToTest(a类){
//这里的逻辑
Foo b=a.getSomeField();

b、 do();//您的
方法测试调用
a.getSomeField()
,但测试的设置部分不希望调用该调用。您需要类似以下内容:

Foo foo = new Foo();
EasyMock.expect(mock.getSomeField()).andReturn(foo);
或要取消呼叫:

Foo foo = new Foo();
EasyMock.expect(mock.getSomeField()).andStubReturn(foo);
(在调用
mock.getSomething()
之前)


查看
andReturn
andStubReturn

之间的区别,你是对的,我也忘了测试它。但事实并非如此。问题是,你可以看到我的构造函数初始化
someField
,当我进行模拟时,
someField
为空,因此整个
methodToTest
中断。这意味着构造函数没有被调用?@su234fk234hawuhsafklsfjs:你的正常实现所做的是无关的。你在模拟那个类,所以它的行为无关紧要。只要你模拟你正在进行的调用,以便
getSomeField()
返回一个非空引用,这很好。但问题是
getSomeField();
确实返回空引用,因为
SomeClass
初始化
someField
没有其他设置程序。如果
b.do()抛出NPE,我不明白如何通过测试
@su234fk234hawuhsafklsfjs:如果您告诉EasyMock返回不同的内容,它不会返回null。这就是我回答中代码的重点。您尝试过这个解决方案吗?啊,现在我明白了,谢谢。我会尝试,明天通知您