我刚刚开始使用 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/