gpt4 book ai didi

java - 如何测试嵌套包中的代码

转载 作者:行者123 更新时间:2023-12-01 12:14:38 25 4
gpt4 key购买 nike

我想用mockito测试我的java代码,并且我希望公开我的所有方法。

我的问题如下,假设我有以下代码:

package com.whatever;

public class Parent
{
public void PlayWithChild(Child child)
{
child.Hug();
}
}

package com.whatever.subpackage;

public class Child
{
public void Hug()
{
}
}

我有测试:

package com.whatever;

import com.whatever.subpackage;

public class Test
{
@Test
public void PlayWithChild_ChildHugged()
{
//Arrange
Child mckChild = Mockito.mock(Child.class);

//Act
new Parent(mckChild).PlayWithChild();

//Assert
Mockito.verify(mckChild).Hug();
}
}

现在,如果我使 Hug 方法包可访问(删除)“公共(public)”,那么我无法从测试中访问它......并且我不想将所有内容(父项、子项和我的整个可测试项)放入库)到同一个包,我想组织它们。

最佳答案

您需要决定您希望设计具有何种程度的封装和抽象。 Java 没有特别精细的方法来指定哪些组件可以从哪些其他组件访问,因此您可能必须在文档中表达这些内容,而不是依赖编译器为您强制执行它们。 p>

就您而言,我认为您应该将 Hug 方法公开;如果你想让它更清楚,请添加相应的Javadoc或将Child放入名为“internal”的子包中,以阻止其随意使用。

<小时/>

Java 的四个访问级别:

  • 公共(public)访问,这不会对测试或模拟造成任何问题
  • protected 访问,包括包访问和包外子类。在同一个包中进行测试很容易,但您可能必须创建手动测试替身来访问/验证来自相关包外部的 protected 方法调用。
  • 默认或包私有(private)访问,正如您所指出的,很容易从同一包内测试/调用。在其他包中,这些方法不以任何有意义的方式存在用于调用或测试。
  • 私有(private)方法,无法直接调用或测试。

为什么有人会在测试驱动开发中创建私有(private)方法? 简单:因为私有(private)方法是不需要测试的实现细节。同样, protected 或包私有(private)方法是不需要在包外部进行测试的实现细节。在这里,如果 Hug() 方法是公共(public)的,并且它调用私有(private)或包私有(private)方法 FeelBetter(),那么来自其他包的调用者应该仅使用 public API Hug,而不调用或关心其实现详细信息如 FeelBetter()。

这样做的结果是几乎鼓励大型的、范围过大的包,因为这可能看起来是隐藏其他包不相关的实现细节并限制入口点数量的最佳方式。确实,将密切的协作者放在同一个包中可以允许使用小包 API,这是一个很好的目标。然而,如果一个包中有足够多的类,这个概念就会被打破。幸运的是,只有当这个包被证明大到需要两个单独的包时,它才会崩溃,此时您可以停下来思考哪些组件是连接的,哪些组件可以提取到 API 中他们自己的。这可能意味着将某些类/方法的访问范围从包扩大到公共(public),这是拆分包时所期望的。它还可能意味着为了测试而添加可访问的 getter 或其他状态查询方法,这也是开发可测试组件时所期望的。

有关如何创建可测试系统以及如何与测试替身(或真实测试组件)交互的更多信息,我建议阅读 Martin Fowler 的文章 Mocks Aren't Stubs

关于java - 如何测试嵌套包中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com