java - 单元测试中的模拟域实体

标签 java unit-testing junit mockito

我有一个非常简单的问题:我一直在向具有 Context 对象的命令对象编写一些单元测试。该上下文内部有一些域实体。

    public class Context { 
          private DomainEntity domainEntity1;
          private Dto dto1;

          // getters and setters go here...

          public boolean isDomainEntityValid() {
              // a little bit of logic goes here
          }
    }

    public class Command {

          public void execute(Context context) { 
                // do its logic in here
          }
    }

DTO 和 DomainEntity 只有 setter 和 getter 以及非常简单的验证方法(例如 isFirstNameValid())。

Context 对象确实有逻辑 - 毕竟,它检查上下文是否一致,上下文是否完整,等等。

当对命令对象进行单元测试时,我很清楚应该模拟上下文 - 但是实体和 dto 呢?我应该 mock 他们吗?如果是这样,我将不得不执行大量如下代码

    doReturn(1L).when(domainEntity1).getId();
    doReturn("phil").when(domainEntity1).getName();

换句话说,必须定义 getter 方法的许多行为。

所以,底线是:在对对象进行单元测试时我应该模拟域实体和 DTO 吗?

最佳答案

我认为您可能违反了 "Law" of Demeter这里。我把它放在引号中是因为你不应该将其作为法律来遵循,而应该作为建议来遵循。

您并没有真正为我们提供足够的上下文来告诉您应该具体更改什么(即:为什么命令需要 id 和名称?),但是还有另一个原则称为 Tell, Don't Ask我认为如果您更改代码以遵循这一点,您的代码将变得更容易测试。

关于java - 单元测试中的模拟域实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14390512/

相关文章:

java - 为什么 XMLDecoder 不尊重 transient 关键字?

java - Android - Realm 日期日

c# - Assert.Equals 的用法是什么?

java - 断言失败时触发函数

java - 在客户端和服务器之间共享 JUnit 测试

java - 如何缩放程序以正确的屏幕分辨率?

java - 使用私有(private)构造函数对 spring 组件进行单元测试,无需注入(inject)

java - 使用 CouchBase-Lite 移动设备进行单元测试,无需 Android 应用程序上下文

java - 编写 JUnit 时如何绕过 Runtime.getRuntime()?

unit-testing - 在对公共(public)方法进行单元测试时是否可以使用另一个公共(public)方法进行验证