面试题答案
一键面试设计单元测试用例的方法
- 针对接口:
- 功能测试:
- 为接口的每个方法设计测试用例,确保方法签名正确,输入输出符合预期。例如,如果接口方法接收一个字符串参数并返回一个布尔值,测试用例应覆盖不同类型的字符串输入(空字符串、正常字符串、超长字符串等),检查返回的布尔值是否正确。
- 对于接口中定义的默认方法,如果有的话,也要进行测试,验证其默认行为是否满足需求。
- 异常测试:考虑可能引发的异常情况。比如,若接口方法在特定输入下应抛出特定异常(如
IllegalArgumentException
),编写测试用例触发这种异常并验证异常类型和异常信息是否正确。
- 功能测试:
- 针对抽象类:
- 抽象方法:虽然抽象类不能实例化,但可通过创建匿名内部类来测试抽象方法。在匿名内部类中实现抽象方法,然后对实现的方法进行功能和异常测试,如同测试普通类的方法一样。
- 具体方法:对于抽象类中的具体方法,直接通过匿名内部类实例化抽象类来调用这些方法进行测试。同样进行功能和正常边界值、异常边界值等测试。例如,如果抽象类的具体方法对输入数据有范围限制,测试用例要覆盖边界值和超出范围的值。
- 继承层次:如果抽象类处于多层继承结构,要测试继承关系是否正确传递功能。例如,子类继承抽象类后,验证子类是否正确继承了抽象类的非抽象方法,并且这些方法在子类中的行为符合预期(在不被重写的情况下)。
处理依赖关系的隔离
- 使用Mock框架:例如Mockito,它可以创建接口和抽象类的模拟对象。对于抽象类,Mockito可以通过
@Mock
注解创建模拟对象,然后使用when - thenReturn
等语法来定义模拟对象的行为。对于接口,同样可以轻松创建模拟实例,并设定其方法的返回值或抛出的异常。这样在测试目标类(依赖其他接口或抽象类的类)时,就可以用模拟对象代替真实的依赖,从而隔离依赖关系。 - 依赖注入:在设计项目架构时,采用依赖注入模式。在测试时,通过构造函数或setter方法注入模拟的依赖对象。例如,如果一个类
A
依赖于接口B
的实现,在A
的构造函数中传入B
的实例。在测试A
时,传入B
的模拟实例,这样就可以控制A
对B
的依赖,达到隔离的目的。 - 分层测试:对于多层继承和接口组合的情况,分层进行测试。先测试底层的抽象类和接口,确保它们的功能正确。然后在测试上层类时,利用已经测试过的底层模拟对象,这样可以清晰地隔离不同层次之间的依赖关系,并且便于定位问题。例如,先测试最基础的抽象类
BaseAbstractClass
,然后在测试继承自它的SubAbstractClass
时,使用BaseAbstractClass
的模拟对象来隔离依赖,专注于测试SubAbstractClass
新增或修改的功能。