Java 相互引用的单元测试子类
在Java中,我有一个抽象类Java 相互引用的单元测试子类,java,unit-testing,Java,Unit Testing,在Java中,我有一个抽象类Place,有两个具体的子类Area和Level;一个级别必须有一个父区域。但是在尝试为级别进行单元测试时,我不想创建区域的完整实例。我认为有两种方法可以解决这个问题: 1) 创建一个接口IPlace,由接口IArea扩展,该接口放置和区域实现。然后创建一个实现IArea的MockArea类,并在测试时将其传递到级别 2) 使用模拟框架,它将自动为我创建模拟对象 哪条路更好?或者有第三种方法吗?你没有告诉我们为什么你不想创建一个完整的区域,但是让我们假设它做了一些难以
Place
,有两个具体的子类Area
和Level
;一个级别
必须有一个父区域
。但是在尝试为级别
进行单元测试时,我不想创建区域
的完整实例。我认为有两种方法可以解决这个问题:
1) 创建一个接口IPlace
,由接口IArea
扩展,该接口放置和区域
实现。然后创建一个实现IArea
的MockArea
类,并在测试时将其传递到级别
2) 使用模拟框架,它将自动为我创建模拟对象
哪条路更好?或者有第三种方法吗?你没有告诉我们为什么你不想创建一个完整的区域,但是让我们假设它做了一些难以测试的事情,比如连接到数据库或读取文件或其他东西。这些是它所具有的依赖关系。依赖注入就是答案
例如,假设Area
在其构造函数中执行以下操作:
public Area() {
//get db connection
//do something with db connection
}
现在,当您创建级别时,它将连接到DB。下面是如何重写构造函数以使用依赖项注入:
public Area(Connection con) {
//do something with db connection
}
现在,当您创建一个级别
时,您可以给它一个假的连接
,并能够测试您的级别
现在,您可以使用模拟框架来创建一个假的连接
。我推荐Mockito。正如您所写的,我建议使用mocking框架
依赖注入很棒。使用它可以让您的类以一种明显的方式声明它们需要与哪些类型的事物交互。如果操作得当,通常不可避免地需要模拟对象。习惯于使用模拟框架。我个人喜欢Mockito。是否有理由让级别
必须知道区域
是一个区域
而不是一个地方
?2)我更容易(,)一个级别
不能在另一个级别
内,只能在区域
内。你应该避免“哪个更好”的问题。如果您已经考虑过一种方法,为什么它不够用?Area
没有做任何昂贵的事情。只是我对单元测试是新的,我读过的所有内容都是用模拟对象替换所有依赖项。只需在您的LevelTest
中的Level
中测试公共方法,并在区域测试中测试区域中的公共方法。确保你没有两次测试相同的东西。你可以走了。如果父母的设计不好,可能会引起问题。我举了一个设计拙劣的家长的例子。只要你不在那种情况下,就没关系。