Java 是否鼓励使用方法变量而不是类变量进行单元测试?
在类内编写函数时,我们是否应该尝试使用方法2将函数与类变量解耦,以便更好地对单个函数进行单元测试?始终将类变量作为方法参数传递给类函数是一种好的做法吗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) {
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