java - 在 Java 中保持单元测试隔离

标签 java unit-testing

我刚刚开始使用 Java,我对如何在保持所有内容隔离的同时对 Java 类进行单元测试感到困惑。具体来说,我想知道如何在本例中测试像 createProgram 这样的方法:

package com.example.app;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;

import com.example.data_models.Program;

public class ProgramCreator {
    private PersistenceManagerFactory pm_factory;

    public ProgramCreator(PersistenceManagerFactory pm_factory) {
        this.pm_factory = pm_factory;
    }

    public void createProgram(String name, String instructor, double price) {
        PersistenceManager pm = getPersistenceManager();

        try {
            pm.makePersistent(new Program(name, instructor, price));
        } finally {
            pm.close();
        }
    }

    private PersistenceManager getPersistenceManager()
    {
        return this.pm_factory.getPersistenceManager();
    }
}

我非常确定我可以使用像 mockito 这样的库来模拟持久性管理器工厂,并使用它来测试 makePersistent 方法是否被正确调用参数,但如何检查程序数据模型的字段是否正确,同时仍保持所有内容隔离?我不想依赖程序对象的 getter 方法,因为这会导致我的 ProgramCreator 单元测试依赖于 Program 类是正确的。在这种情况下我该怎么办? (使用 Ruby,我可能会删除 Program 类的 new 方法。在 Java 中可能有类似的方法吗?)

最佳答案

通过在 createProgram 方法中创建对象(程序),您可以在对象之间创建紧密耦合。相反,将创建工作委托(delegate)给工厂,您可以在单元测试中模拟工厂。这意味着我们将仅测试 createProgram 方法正在执行的操作,而不测试其他任何操作。尝试对代码进行单元测试可以为我们提供重新设计/重构代码的指示。

public class ProgramCreator {
    private PersistenceManagerFactory pm_factory;
    private ProgramFactory p_factory;

    public ProgramCreator(PersistenceManagerFactory pm_factory, ProgramFactory pFactory) {
        this.pm_factory = pm_factory;
        this.p_factory = pFactory;
    }

    public void createProgram(String name, String instructor, double price) {
        PersistenceManager pm = getPersistenceManager();
        try {
            pm.makePersistent(p_Factory.createProgram(name, instructor, price));
        } finally {
            pm.close();
        }
    }
}

关于java - 在 Java 中保持单元测试隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037980/

相关文章:

java - 我想为我们的用户提供打印屏幕的功能,然后使用 Ctrl+V 将图像添加为附件而不在任何地方保存图像

javascript - Jasmine toBeCloseTo 第二个参数是什么?

javascript - 单元测试 Angular 时 "angualar.module"和 "module"之间的区别

python - 属性错误 : can't set attribute

java - 当前最佳的单元测试 EJB3/JPA 框架

c# - 为什么要在 UnitTest 中的 TestMethod 属性上加上括号

java - SonarQube 扫描仪在对一个 java 文件进行 AST 扫描期间卡住

c# - Java 为 C# 表达式提供了哪些替代方案?

java - Bouncy CaSTLe ASN1 从 BERTaggedObject 检索对象

java - 未加载高级 GWT 组件主题 CSS