java中的测试数据库类

java中的测试数据库类,java,unit-testing,junit,mockito,powermock,Java,Unit Testing,Junit,Mockito,Powermock,我有一个类,它执行基本的数据库操作,例如在数据库中保存、检索和删除对象。它有一个buildConnection()方法,在每次操作之前调用该方法 我还有另一个类,它从DB类调用saveObject方法来存储它创建的图形(如果它不存在),然后在getter中返回它。为了测试这个getter,我尝试了junit,但它在存储对象的部分失败,当我第一次设置图形,然后尝试检索它时,它给了我java.lang.ExceptionInInitializerError,但是当我调用getter而没有先设置图形,

我有一个类,它执行基本的数据库操作,例如在数据库中保存、检索和删除对象。它有一个
buildConnection()
方法,在每次操作之前调用该方法

我还有另一个类,它从DB类调用
saveObject
方法来存储它创建的图形(如果它不存在),然后在getter中返回它。为了测试这个getter,我尝试了junit,但它在存储对象的部分失败,当我第一次设置图形,然后尝试检索它时,它给了我
java.lang.ExceptionInInitializerError
,但是当我调用getter而没有先设置图形,以便创建图形时,我得到一个
java.lang.NoClassDefFoundError
。我需要用单元测试来测试这两个类,但我找不到任何简单的例子

DB类大纲:

public final class DbUtils {

    private static Connection connectionDB;

    private static void establishConnection() { 
     ...
    }

    private static void closeConnection() {
     ... 
    }

    public static void saveObject(final Object graph, final Object map) {

        establishConnection();

        //convert Objects to Byte and store it;

        closeConnection();
    }

    public static Map<String, Object> retrieveObject(final String key) {
        establishConnection();
        //read byte and convert to object
        closeConnection();
        return multireturn;
    }

    public static boolean deleteObject(final String key) {
        establishConnection();
        //delete all object except object with key
        closeConnection();
        return (affectedRow >= 1);

    }

}
当前测试:

@Mock
GraphCreation graph;

@Test
public void testSettingDependencyGraph() {
    graphCreation.setGraph(graph);
    Assert.assertEquals(Graph, graphCreation.getGraph());
}

@Test
public void testCreatingGraph(){
    graphCreation.setApplicationContext(applicationContext);
    graphCreation.setGraph(new Graph());
    moduleRegistrationBeans = new HashMap<String, ModuleRegistration>();
    ModuleRegistration m1 = new ModuleRegistration();
    m1.setName("module1");
    SDF1 = new TestSourceDataFactoryTemplate();
    VM1 = new TestModuleTemplate();
    m1.setSourceDataFactory(SDF1);
    m1.setModule(VM1);
    moduleRegistrationBeans.put("module_1", m1);
    PowerMock.reset(BeanFactoryUtils.class);
    PowerMock.mockStatic(BeanFactoryUtils.class);
    EasyMock.expect(BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ModuleRegistration.class)).andReturn(moduleRegistrationBeans);
    PowerMock.replay(BeanFactoryUtils.class);
    graphCreation.getDependencyGraph();
}
@Mock
图形创建图;
@试验
public void testSettingDependencyGraph(){
graphCreation.setGraph(图形);
Assert.assertEquals(Graph,graphCreation.getGraph());
}
@试验
public void testCreatingGraph(){
graphCreation.setApplicationContext(applicationContext);
setGraph(newgraph());
moduleRegistrationBeans=newHashMap();
ModuleRegistration m1=新的ModuleRegistration();
m1.设置名称(“模块1”);
SDF1=新的TestSourceDataFactoryTemplate();
VM1=新的TestModuleTemplate();
m1.设置源数据工厂(SDF1);
m1.设置模块(VM1);
moduleRegistrationBeans.put(“module_1”,m1);
reset(BeanFactoryUtils.class);
mockStatic(BeanFactoryUtils.class);
expect(BeanFactoryUtils.beansoftypeincludingOriends(applicationContext,ModuleRegistration.class)).andReturn(moduleRegistrationBeans);
replay(BeanFactoryUtils.class);
graphCreation.getDependencyGraph();
}
这两个测试都在GraphCreation类中的saveToDB()方法失败。 我是单元测试新手,这些测试是由其他开发人员编写的,我添加了一个DB特性,现在单元测试失败了。
有人可以帮助我或指导我如何解决这个问题,并为DB类创建单元测试。

看起来你负担太重了;或者反过来说:你尝试做很多事情。。。不知道你在做什么

第一:
DbUtils
具有静态方法。这是一项“直截了当”的任务,但有一些微妙的事情需要纠正。如果你在那里搞砸了,那根本不管用。因此:您必须严格遵循概述的所有步骤

但更重要的是:你不明白嘲笑本质上是什么。含义-此处为:

@Mock
GraphCreation graph;
连同

graphCreation.setApplicationContext(applicationContext);
graphCreation.setGraph(new Graph());
...
根本没有任何意义

当您告诉Mockito(或PowerMock,或任何其他框架)对类进行mock时,您将创建一个mock。该模拟仅“似乎”属于测试的类别;但这只是一个“空壳”。该对象与生产代码毫无关系。换句话说:像您这样对该模拟对象调用方法是一个无操作。那没什么用处

相反:您可以使用
new
实例化被测试类的对象!也许你为那个“真实”对象提供了模拟对象;因为真正的对象需要单元测试环境中的模拟对象。然后在真实对象上调用一个方法;而你“断言”了这个结果;或者,您可以验证提供给真实对象的模拟是否看到了您希望看到的方法调用

长话短说:退后一步,阅读如何正确地进行单元测试,以及模拟是如何发挥作用的。开始阅读

除此之外:到处使用静态方法是不好的做法。您应该认真考虑用非静态版本替换该解决方案(或者至少:在静态类上放置包装器)。因为这样,您也可以在不使用PowerMock的情况下进行测试

最后:NoClassDefFoundError表示您正在尝试运行某些东西。。。但是类路径设置中缺少一个或多个必需的类。可能是因为你的嘲笑搞错了


但关键是:放慢速度;并且了解你想做什么。而不是建立一个巨大的,复杂的问题,实际上包括许多微妙的不知道你正在做的事情。

看起来你是负担过重;或者反过来说:你尝试做很多事情。。。不知道你在做什么

第一:
DbUtils
具有静态方法。这是一项“直截了当”的任务,但有一些微妙的事情需要纠正。如果你在那里搞砸了,那根本不管用。因此:您必须严格遵循概述的所有步骤

但更重要的是:你不明白嘲笑本质上是什么。含义-此处为:

@Mock
GraphCreation graph;
连同

graphCreation.setApplicationContext(applicationContext);
graphCreation.setGraph(new Graph());
...
根本没有任何意义

当您告诉Mockito(或PowerMock,或任何其他框架)对类进行mock时,您将创建一个mock。该模拟仅“似乎”属于测试的类别;但这只是一个“空壳”。该对象与生产代码毫无关系。换句话说:像您这样对该模拟对象调用方法是一个无操作。那没什么用处

相反:您可以使用
new
实例化被测试类的对象!也许你为那个“真实”对象提供了模拟对象;因为真正的对象需要单元测试环境中的模拟对象。然后在真实对象上调用一个方法;而你“断言”了这个结果;或者你可以验证模拟是否