Java 函数的Junit测试

Java 函数的Junit测试,java,mockito,Java,Mockito,对于Junit测试,我有一个困惑。对于一些具有封闭业务逻辑的函数(添加函数),我们可以通过断言函数来进行单元测试 比如说 public int add(int a,int b){ int c = a+b; return c; } public int foo(int totalnum){ Zoo soo = new Zoo(); int giraffNumber = soo.giraffe(totalnum);//here we are calling another meth

对于Junit测试,我有一个困惑。对于一些具有封闭业务逻辑的函数(添加函数),我们可以通过断言函数来进行单元测试

比如说

public int add(int a,int b){
  int c = a+b;
  return c;
}
public int foo(int totalnum){
  Zoo soo = new Zoo();
  int giraffNumber = soo.giraffe(totalnum);//here we are calling another method
  return giraffNumber;
}
但是对于路线中的某些功能(如下面的示例),我们必须采用什么方法

比如说

public int add(int a,int b){
  int c = a+b;
  return c;
}
public int foo(int totalnum){
  Zoo soo = new Zoo();
  int giraffNumber = soo.giraffe(totalnum);//here we are calling another method
  return giraffNumber;
}
对于这类方法,我们需要做什么?我们是否需要编写另一个类


谁能给我举个例子吗

单元测试的教条式方法是,您一次只能测试一件事情,这意味着您不允许在要测试的代码中使用
new
,因为这必然会在您已经开始测试的事情之外再创建一件事情

解决这个问题的方法是依赖注入。这意味着您的代码不是从那里获取其依赖项(例如使用
new
创建代码想要使用的类),而是从外部向您的代码提供其依赖项

因此,在
foo()
的情况下,这意味着要么将
Zoo
的实例作为参数传递给
foo()
,要么更好的是,将
Zoo
工厂作为构造函数参数传递给包含
foo()
的类,这样
foo()
可以调用工厂以获取
Zoo
的实例

通过这种方式,您可以传递一个特制的
Zoo
实现以用于测试,例如在
mockito
的帮助下创建的实现


当然,还有一种非教条式的单元测试方法,即您应该将要测试的每件事情都视为一个黑盒子,而不必担心它是如何实现的,而只需担心为某个输入获得正确的结果。还有人指出,这不是单元测试,而是集成测试。然后认识到没有单元测试,只有集成测试。但现在我们已经进入了哲学领域。

理想情况下,你可以将局部变量转换为类的一个字段。或者,可能不是动物园对象,而是动物园对象的工厂

该因子通过依赖项注入插入。现在,您可以使用Mockito之类的模拟框架让工厂实例返回模拟的Zoo对象


也就是说,你可以控制这些物体。关键是不要为业务逻辑对象调用新对象

你有一些选择。要么在测试系统中包含Zoo,要么进行一些模拟。如果要用Mockito模拟
soo
,可能需要重构此代码。看看Mockito维基。