Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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 如何在服务层中测试Add方法?_Java_Unit Testing - Fatal编程技术网

Java 如何在服务层中测试Add方法?

Java 如何在服务层中测试Add方法?,java,unit-testing,Java,Unit Testing,我了解到,通常私有方法不需要进行单元测试,因为它们是由公共方法测试的。那么,我应该在服务层做什么呢 我有一个服务层和一个向数据库添加文章的方法。此方法检查有关文章及其文件的一些逻辑,然后通过存储库保存: public void AddArticle(ArticleDto article) { CheckArticleFiles(article); CheckArticleTitle(article.Title); CheckArticleSummary(article.

我了解到,通常私有方法不需要进行单元测试,因为它们是由公共方法测试的。那么,我应该在服务层做什么呢

我有一个服务层和一个向数据库添加文章的方法。此方法检查有关文章及其文件的一些逻辑,然后通过存储库保存:

public void AddArticle(ArticleDto article)
{
    CheckArticleFiles(article);

    CheckArticleTitle(article.Title);
    CheckArticleSummary(article.Summary);
    CheckArticleBody(article.Body);

    _articleRepository.AddArticle(article.MapToDbModel());
    _articleRepository.SaveChanges();
}
所有的检查代码现在都是公开的,以使它们能够进行测试,我认为这不是正确的方法(因为OOP原则)。另一方面,如果我将它们更改为private,则应使用AddArticle方法对它们进行测试。在这种情况下,我认为这不是一个单元测试。因为它不是一个单元,并且此方法充当编排器

如果我使用具有私有逻辑的域模型,就会出现这种情况。而逻辑是需要测试的最重要的部分,不需要公开甚至保护


那么,我这里的错误是什么呢?

我会对每一条业务逻辑进行单元测试

 CheckArticleFiles(article);
 CheckArticleTitle(article.Title);
 CheckArticleSummary(article.Summary);
 CheckArticleBody(article.Body);
您没有显示任何代码,但这些方法似乎有特定的业务规则,这就是您需要测试的

您还需要确保您的回购协议确实有效,因此您可以围绕此进行一些集成测试,这里是一些数据,我希望数据库数据如下所示

注意,Add方法应该返回一些内容,这样您至少可以执行一些健全性检查,例如返回所创建文章的唯一id,这样您就可以知道您的方法是否实际有效,此外,它还允许您执行其他有趣的操作,例如创建指向新创建文章的链接,因为您现在知道了id


很难添加更多的代码,因为到目前为止您还没有实际显示任何有用的代码。例如,我将有一个Article类,所有业务逻辑都将在其中运行。回购协议和储蓄部分将不在这一范围之内。拥有一个检查标题的公共方法并不是一件坏事,它允许您单独检查内容,而不是一次检查整个内容。这也取决于您如何使用它。

我会对每个业务逻辑进行单元测试

 CheckArticleFiles(article);
 CheckArticleTitle(article.Title);
 CheckArticleSummary(article.Summary);
 CheckArticleBody(article.Body);
您没有显示任何代码,但这些方法似乎有特定的业务规则,这就是您需要测试的

您还需要确保您的回购协议确实有效,因此您可以围绕此进行一些集成测试,这里是一些数据,我希望数据库数据如下所示

注意,Add方法应该返回一些内容,这样您至少可以执行一些健全性检查,例如返回所创建文章的唯一id,这样您就可以知道您的方法是否实际有效,此外,它还允许您执行其他有趣的操作,例如创建指向新创建文章的链接,因为您现在知道了id


很难添加更多的代码,因为到目前为止您还没有实际显示任何有用的代码。例如,我将有一个Article类,所有业务逻辑都将在其中运行。回购协议和储蓄部分将不在这一范围之内。拥有一个检查标题的公共方法并不是一件坏事,它允许您单独检查内容,而不是一次检查整个内容。这也取决于您如何使用它。

通常,部分接口设计为仅在某些上下文中使用(仅在配置期间、仅在初始化期间、仅从某些线程、仅从测试代码、仅在某些系统状态下……)。编程语言表达这种可能性,使得真正的技术壁垒被创建是相当有限的(通常是公共的和私有的,通常是受保护的,有时会多一点)-并且经常有足够的技巧来克服障碍,如公有或私有声明,例如在C++中使用预处理器技巧,在Java和类似语言中使用内省。例如,在Python中,这样的机制完全被约定所取代——如果不遵循约定,迟早会失去控制

从一个不着眼于特定编程语言的角度来看事物,我更倾向于考虑<代码>公共< /代码>,<代码>私有< /代码>等,更多的是表示体系结构约束的逻辑概念。例如,将一些表示实现细节的私有函数提取到一个单独的类中作为公共方法并不会改变它们作为实现细节的性质:其他组件当然也不应该使用其他类,如果这些实现细节发生变化,则使用该类的测试代码不会受到任何影响。我提到这一点只是为了证明,我认为公开一个方法但告诉其他人不要使用该方法与将其提取到另一个类并告诉其他人不要使用该类没有多大区别

在您的情况下,您希望表示某些函数应被视为实现细节(
私有
),但出于单元测试的目的仍然可以访问。是的,我同意直接测试
private
函数比从服务层间接测试它们更有意义。这当然是一种权衡,但根据我的经验,我也知道这种情况

最简单的方法是(如果您使用的语言没有提供任何更好的技巧,如C++的
friend
construct),正如您所建议的那样,公开这些方法并记录它们不打算使用。如果您想使这一点更加突出,一种可能是使函数公开可访问,但通过命名来表示使用上的限制。只能由测试使用的函数
foo
可以命名为
forTestingOnly\u foo
。由于这使得在私有上下文中调用函数时也很难看,
foo
仍然可以是一个带有非私有包装的私有函数
forTestingOnly\u foo