如何在方法中覆盖对象创建?
public class ClassToTest {
public Object testMethod() {
... code ...
Object result;
try {
result = new ClassToMock(someParam).execute();
} catch (Exception e) {
// handle error
}
return result;
}
}
我的测试如何覆盖ClassToMock的“execute”方法?我很乐意使用EasyMock进行代码示例。我想测试“testMethod”,例如:
@Test
public void testMethodTest(){
ClassToTest tested = new ClassToTest();
// Mock ClassToMock somehow
tested.testMethod();
// Verify results
}
答案 0 :(得分:3)
简单地说:那不起作用。
您无法模拟对 new 的调用(使用EasyMock。虽然可以使用PowerMock(ito)或JMockit等框架)。
但更好的方法是:使用依赖注入,以便将已创建的对象传递到您正在测试的类中。
更确切地说:如果你的班级真的不需要任何其他对象,那么测试会更像是
@Test
public void testFoo() {
ClassToTest underTest = new ClassToTest(...)
underTest.methodToTest();
assertThat( ... )
换句话说:为了测试你的类,你只需要实例化它;然后你调用它的方法;并使用断言来检查它的预期状态。
请参阅here,了解我正在谈论的内容(但有点冗长)。
答案 1 :(得分:1)
如果类的方法未标记为final
try {
ClassToMock mock = new ClassToMock(someParam){
public Object execute(){ //Such that your method is public
//If you want to call back to the pure method
//super.execute()
//Do override things here
}
};
result = mock.execute();
} catch (Exception e) {
// handle error
}
答案 2 :(得分:-1)