您好我正在努力解决简单的问题。
总体思路:
class Foo(){
public boolean method1();
public String method2();
public String method3();
public String shortcut(){
return (method1() == true) ? method2() : method3();
}
}
我该如何测试快捷方式?
我知道如何模拟使用其他对象的对象和测试方法。样品:
class Car{
public boolean start(){};
public boolean stop(){};
public boolean drive(int km){};
}
class CarAutoPilot(){
public boolean hasGotExternalDevicesAttached(){
//Hardware specific func and api calls
//check if gps is available
//check if speaker is on
//check if display is on
}
public boolean drive(Car car, int km){
//drive
boolean found = hasGotExternalDevicesAttached();
boolean start = c.start();
boolean drive = c.drive(km);
boolean stop = c.stop();
return (found && start && drive && stop) == true;
}
}
class CarAutoPilotTest(){
@Test
public void shouldDriveTenKm(){
Car carMock = EasyMock.Create(Car.class);
EasyMock.expect(carMock.start()).andReturns(true);
EasyMock.expect(carMock.drive()).andReturns(true);
EasyMock.expect(carMock.stop()).andReturns(true);
EasyMock.reply(carMock);
CarAutoPilot cap = new CarAutoPilot();
boolean result = cap.drive(cap,10);
Assert.assertTrue(result);
EasyMock.verify(carMock);
}
}
但是hasGotExternalDevicesAttached()方法怎么样?这只是样本不真实的情况。我该如何测试驱动方法?我还应该模拟hasGotExternalDevicesAttached函数吗?
我可以模拟正在测试的课程吗?
答案 0 :(得分:3)
我会为每个方法创建一个测试。如果降低复杂性,那么测试就容易得多。
这些应该分别进行一次测试:
public boolean method1();
public String method2();
public String method3();
没有必要测试最后一个方法,因为它调用了你的其他方法,但是,如果那个方法改变了(因为我猜它只是一个示例代码)并且它有更多逻辑,那么你应该有一个测试方法也是为了那个。
当涉及到hasGotExternalDevicesAttached()时,你应该为你无法测试的所有外部io调用创建一个mocker。
如果您想在测试中提高自己的技能,我建议您阅读The Art of Unit Testing。在我看来,这是初学者学习和学习单元测试艺术的最佳书籍。
答案 1 :(得分:3)
您可以创建CarAutoPilot
的子类,在其中覆盖hasGotExternalDevicesAttached()
,并使用此子类的实例运行测试。
你可以内联:
CarAutoPilot cap = new CarAutoPilot() {
public boolean hasGotExternalDevicesAttached(){
// return true or false depending on what you want to test
}
};
通过这种方式,您可以为CarAutoPilot
的其余行为创建有效的单元测试。
如果你愿意,你可以称之为穷人的部分嘲笑: - )
答案 2 :(得分:1)
是的,您可以使用EasyMock Class Extension库。在documentation of EasyMock中查找“部分嘲笑”。
这个想法只是模拟对象的一个(或一些)方法,并测试依赖于模拟方法的方法。