EasyMock - 覆盖对象创建
EasyMock - override an object creation
如何覆盖方法内的对象创建?
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
}
只有在 class 的方法未标记为 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
}
简单地说:那是行不通的。
您不能模拟对 new 的调用(使用 EasyMock。尽管可以使用 PowerMock(ito) 或 JMockit 等框架)。
但更好的方法是:使用 依赖注入 以便将已经创建的对象传递到您正在测试的 class 中。
更准确地说:如果您的 class 真的不需要任何其他对象来工作,那么测试更像是
@Test
public void testFoo() {
ClassToTest underTest = new ClassToTest(...)
underTest.methodToTest();
assertThat( ... )
换句话说:为了测试你的class,你只需实例化它;然后你调用它的方法;然后你使用断言来检查它的预期状态。
请参阅 here 以获得关于我所谈论内容的出色(虽然有点冗长)解释。
使用 Powermock 是可能的。使用 powermock,您还可以模拟 'new' 运算符
ClassToMock mock = PowerMock.createMock(ClassToMock.class);
PowerMock.expectNew(ClassToMock.class, parameterValues).andReturn(mock);
PowerMock.replayAll();
更多详情请参考这篇link
如何覆盖方法内的对象创建?
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
}
只有在 class 的方法未标记为 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
}
简单地说:那是行不通的。
您不能模拟对 new 的调用(使用 EasyMock。尽管可以使用 PowerMock(ito) 或 JMockit 等框架)。
但更好的方法是:使用 依赖注入 以便将已经创建的对象传递到您正在测试的 class 中。
更准确地说:如果您的 class 真的不需要任何其他对象来工作,那么测试更像是
@Test
public void testFoo() {
ClassToTest underTest = new ClassToTest(...)
underTest.methodToTest();
assertThat( ... )
换句话说:为了测试你的class,你只需实例化它;然后你调用它的方法;然后你使用断言来检查它的预期状态。
请参阅 here 以获得关于我所谈论内容的出色(虽然有点冗长)解释。
使用 Powermock 是可能的。使用 powermock,您还可以模拟 'new' 运算符
ClassToMock mock = PowerMock.createMock(ClassToMock.class);
PowerMock.expectNew(ClassToMock.class, parameterValues).andReturn(mock);
PowerMock.replayAll();
更多详情请参考这篇link