Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相互引用的单元测试子类_Java_Unit Testing - Fatal编程技术网

Java 相互引用的单元测试子类

Java 相互引用的单元测试子类,java,unit-testing,Java,Unit Testing,在Java中,我有一个抽象类Place,有两个具体的子类Area和Level;一个级别必须有一个父区域。但是在尝试为级别进行单元测试时,我不想创建区域的完整实例。我认为有两种方法可以解决这个问题: 1) 创建一个接口IPlace,由接口IArea扩展,该接口放置和区域实现。然后创建一个实现IArea的MockArea类,并在测试时将其传递到级别 2) 使用模拟框架,它将自动为我创建模拟对象 哪条路更好?或者有第三种方法吗?你没有告诉我们为什么你不想创建一个完整的区域,但是让我们假设它做了一些难以

在Java中,我有一个抽象类
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
中测试公共方法,并在
区域测试中测试
区域中的公共方法。确保你没有两次测试相同的东西。你可以走了。如果父母的设计不好,可能会引起问题。我举了一个设计拙劣的家长的例子。只要你不在那种情况下,就没关系。