Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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,在类内编写函数时,我们是否应该尝试使用方法2将函数与类变量解耦,以便更好地对单个函数进行单元测试?始终将类变量作为方法参数传递给类函数是一种好的做法吗 public class User { public string BirthOfMonth = string.Empty; public string BirthOfDay = string.Empty; public MyClass(string month, string day) {

在类内编写函数时,我们是否应该尝试使用方法2将函数与类变量解耦,以便更好地对单个函数进行单元测试?始终将类变量作为方法参数传递给类函数是一种好的做法吗

 public class User 
 {
     public string  BirthOfMonth = string.Empty;
     public string  BirthOfDay = string.Empty;

     public MyClass(string month, string day)
     {
         this.BirthOfMonth = month;
         this.BirthOfDay = day;
     }

     // method 1
     public string GetUserBirthday() {
         return BirthOfMonth +"/" + BirthOfDay;
     }

     // method 2
     public string GetUserBirthday(string month, string day) {
         return month +"/" +day;
     }
}

在类方法中引用类成员是常见的(如上面的方法1)?还是最好将这些成员作为方法参数传递(在上面的方法2中是a),而不是直接在方法中使用它们?

下面的类更好地表示您试图完成的任务(注意封装,这样您就不会暴露您的表示):

然后要进行测试,请按如下所示设置
User

User user = new User("August","3rd");
user.getUserBirthday();
... //do actions here

方法2会非常奇怪,至少在这样一个简单的情况下是如此


另外,为了防止您对Java非常陌生,并且不知道这一点,Java类以大写开头。字符串,而不是字符串。变量和方法是第一个小写字符。birthOfMonth不是birthOfMonth,GetUserBirthofMonth()不是GetUserBirthofMonth()。也许你知道这一点,但我想我会把它扼杀在萌芽状态,以防你不知道。

如果你把属于这个类的变量传递给一个方法,比如你的
公共字符串getUserBirth(字符串月,字符串日)
,您有效地打破了
User
类的数据与处理该数据的操作之间的耦合。面向对象的一个主要思想已经过时了

您必须将您的成员变量
保持为public
,或者为字段引入getter,以便调用者可以使用它们。另一个糟糕的设计选择!这样的代码也违反了这个原则,即拥有数据的类应该处理它,而不是让外部类可以使用内部状态。下面的告诉不要问将导致更好的封装代码,更容易重用

您的代码变得脆弱。您不能再更改用户出生日期的实现(例如,将其切换为使用
日期
,而不是月份和日期的两个单独字段),而不必联系该类的所有呼叫者。实现细节已从Users类中泄漏。您的代码库将是高度耦合的,并且很难修改

至于测试:你有一个奇怪的
MyClass
方法。那应该是一个构造函数吗?它应该被称为
User
。该
用户
构造函数获取出生日期,您可以使用该方法查询它,而无需传递参数,那么为什么不使用它呢?这将导致更好的设计,您仍然可以轻松地进行测试


当您在测试中遇到无法从外部检查预期行为的情况时,请仔细查看您的代码。也许这个班太大了,有一个新的班藏在里面,想要出去?考虑一下。对不起,我不完全理解你的问题。请您重复一遍好吗?您来自C,所以请记住Java有一些区别:string类是
string
,Java等价于C的
string.Empty
。变量和方法的约定也是以小写开头(只有类以大写开头)。而
BirthOfMonth
应该是
monthhofBirth
:-)“至于测试:用户构造函数取出生日期”,如果你看他的代码,就没有
User
构造函数了。@Dan很好。我把
MyClass
方法作为构造函数来阅读。我已经调整了我的答案。他的类应该更新为我提供的类,使其成为有效的
用户
POJO
User user = new User("August","3rd");
user.getUserBirthday();
... //do actions here