使用TDD方法并避免使用Java静态方法

时间:2013-02-20 17:29:39

标签: methods static tdd

我刚收到一些关于求职应用程序Java编码练习的反馈。他们不喜欢这个解决方案和反馈中陈述的两个问题(我非常感激,因为这是非常罕见的反馈):

  • 显然我没有使用TDD方法。
  • 我过度使用静态方法,我知道静态方法是反OO但我只在验证和util类型方法中使用它们。

这里有两个问题:

不使用TDD方法有什么可能的迹象?

哪种编码风格或模式可以替代静态方法?

在前两个回复之后,我有另一个问题。

您是否同意使用静态方法只会在限制代码的可测试性时出现问题,而不是在自身方法中出现问题。

如果静态方法不限制我的代码的可测试性,那么回到我的求职应用练习解决方案是否仍然不好用?我的验证方法非常简单'Validator.notNull(p,“paramName”)''为什么我想要嘲笑它?

非常感谢。

2 个答案:

答案 0 :(得分:3)

不使用TDD的告示标志是对协作者使用静态方法和静态类成员。您不能覆盖静态方法,因此您无法替换模拟以单独使用此类方法来测试类。

您可以使用依赖项注入,而不是在协作者上使用静态协作者或静态方法。在一个简单的编码练习中,您将通过构造函数或通过手动设置器注入依赖项。在现实生活中,您可以使用一个可用的依赖框架。

答案 1 :(得分:2)

您的静态Validaton方法似乎应该成为我对象的一部分。

假设你有一个班级Drink

public class Drink
{
    private readonly string _name;
    private readonly double _temperature;

    public Drink(string name, double temperature)
    {
        _name = name;
        _temperature = temperature;
    }
}

您的businesslogic将能够实例化各种饮料,7up,可乐等等。您想确保饮料具有适当的饮用温度,因此您需要采用Validate方法。你可以按照你的方法:

public void TakeAZip()
{
    if (Validation.HasAppropriateTemp)
    {
        // implement drink
    }
}

静态类的替代方法

这样你就会对你的静态Validation类产生强烈依赖。

或者,您可以使用dependency injection

public void TakeAZip(ITemperatureValidator validator)
{
    if (validator.HasAppropriateTemp)
    {
        // implement drink
    }
}

如果更方便,您也可以选择通过构造函数

传递Validator
    private readonly string _name;
    private readonly double _temperature;
    private ITemperatureValidator _validator;

    public Drink(
        string name, 
        double temperature, 
        ITemperatureValidator validator)
    {
        _name = name;
        _temperature = temperature;
        _validator = validator;
    }

现在您可以mock验证者的行为,您可以将Drink类与所有外部行为隔离开来。