用私有构造函数测试一个类

蓝光10

我试图提出最好的方法来测试当前正在使用的缓存类....当我在测试中运行该类时,我想在下面替换ClientFactory...。我想保留该类的结构为尽可能多,但由于它有一个私有的构造函数,因此我很难考虑最好的测试方法。

public class MyCache {

private final long TIME_OUT

private static MyCache instance = null;

private final HashMap<String, MyObject> cache = new HashMap<String, MyObject>();

private MyCache() {
}

public static MyCache getInstance() {
    if (instance == null) {
        instance = new MyCache();
    }
    return instance;
}

public MyObject getDetails(String id) throws Exception {

    MyObject myObject = cache.get(id);
    if (myObject != null) {
        return myObject;
    } else {
        try {

            // want to be able to replace ClientFactory with test stub
            Client client = ClientFactory.createClient();
            myObject = client.getMyObject(id);

        } catch (NotFoundException nf) {
           .... log error
        } 

        return myObject;
    }
}

}
用户名

您可以做很多事情,但是从测试的角度来看,单例模式不是一个好选择。

  1. 如果使用的是Mockito,则应将ClientFactory.createClient()调用提取到package-public(默认)函数中。Mockito可以监视单例:spy(MyCache.class),并且您可以更改提取函数的行为。因此,您更换了ClientFactory

  2. 您可以将您的private构造函数替换为package-public构造函数,并且还需要提取第一个解决方案中提到的函数。完成这些更改后,您可以扩展MyCache测试类(不使用Mockito)。

  3. 您可以将的功能提取MyCache到package-public类中,该类不是单例的(但不能从外部调用)。您可以很好地对其进行测试,并且它MyCache仅是提取类的单例包装。

我认为反射是反模式,但是我知道默认的访问修饰符(空字符串)也有点丑陋。

关于您的单例模式的几句话。如果您只有一个线程,那么这还不错,但是如果您处于多线程环境中,则需要以下代码:

// you need volatile, because of JVM thread caching
private static volatile MyCache instance;

private MyCache() {}

public static MyCache getInstance() {
    if (instance == null) {
        synchronize(MyCache.class) {
            // yes, you need double check, because of threads
            if (instance == null) {
                instance = new MyCache();
            }
        }
    }
    return instance;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Java / Mockito / PowerMockito用私有构造函数实例化一个类

来自分类Dev

当类只有一个私有构造函数时,如何创建代理?

来自分类常见问题

用私有构造函数扩展类

来自分类Dev

如何检查一个类是否具有默认的构造函数,公共的,受保护的或私有的

来自分类Dev

为什么Java Reflection无法在另一个包中找到某个类的包私有构造函数?

来自分类Dev

C ++-如何在另一个类中使用私有构造函数实例化对象

来自分类Dev

如何使用私有构造函数测试最终类?

来自分类Dev

如果构造函数参数之一是List类型,是否可以用null参数测试私有构造函数?

来自分类Dev

如何用一个非常复杂的构造函数测试一个类?

来自分类Dev

使类构造函数私有

来自分类Dev

使类构造函数私有

来自分类Dev

用Java构造一个类

来自分类Dev

`this`和一个类构造函数

来自分类Dev

定义一个类的构造函数

来自分类Dev

类缺少没有参数的构造函数 - 但我提供了一个构造函数

来自分类Dev

如何在 kotlin 中定义一个只有一个构造函数的类?

来自分类Dev

如何从同一个类的静态函数访问一个类的私有成员?

来自分类Dev

返回一个结构的类函数,该结构是该类的私有成员

来自分类Dev

在oop中将私有函数传递给另一个类是否被认为合适?

来自分类Dev

从私有void函数c#中的另一个类访问变量

来自分类Dev

另一个类的移动构造函数中的移动类(没有默认构造函数)

来自分类Dev

有没有办法有一个ArrayList元素等于类的构造函数?

来自分类Dev

使类抽象vs使构造函数私有

来自分类Dev

抽象类与私有构造函数

来自分类Dev

用参数初始化另一个类构造函数中的对象

来自分类Dev

用JSDoc记录私有构造函数

来自分类Dev

具有从工厂方法创建的私有构造函数的单元测试类

来自分类Dev

如何测试类方法是否从类的私有对象中调用另一个方法

来自分类Dev

构造函数的测试用例,因为我有一个过滤器逻辑

Related 相关文章

  1. 1

    使用Java / Mockito / PowerMockito用私有构造函数实例化一个类

  2. 2

    当类只有一个私有构造函数时,如何创建代理?

  3. 3

    用私有构造函数扩展类

  4. 4

    如何检查一个类是否具有默认的构造函数,公共的,受保护的或私有的

  5. 5

    为什么Java Reflection无法在另一个包中找到某个类的包私有构造函数?

  6. 6

    C ++-如何在另一个类中使用私有构造函数实例化对象

  7. 7

    如何使用私有构造函数测试最终类?

  8. 8

    如果构造函数参数之一是List类型,是否可以用null参数测试私有构造函数?

  9. 9

    如何用一个非常复杂的构造函数测试一个类?

  10. 10

    使类构造函数私有

  11. 11

    使类构造函数私有

  12. 12

    用Java构造一个类

  13. 13

    `this`和一个类构造函数

  14. 14

    定义一个类的构造函数

  15. 15

    类缺少没有参数的构造函数 - 但我提供了一个构造函数

  16. 16

    如何在 kotlin 中定义一个只有一个构造函数的类?

  17. 17

    如何从同一个类的静态函数访问一个类的私有成员?

  18. 18

    返回一个结构的类函数,该结构是该类的私有成员

  19. 19

    在oop中将私有函数传递给另一个类是否被认为合适?

  20. 20

    从私有void函数c#中的另一个类访问变量

  21. 21

    另一个类的移动构造函数中的移动类(没有默认构造函数)

  22. 22

    有没有办法有一个ArrayList元素等于类的构造函数?

  23. 23

    使类抽象vs使构造函数私有

  24. 24

    抽象类与私有构造函数

  25. 25

    用参数初始化另一个类构造函数中的对象

  26. 26

    用JSDoc记录私有构造函数

  27. 27

    具有从工厂方法创建的私有构造函数的单元测试类

  28. 28

    如何测试类方法是否从类的私有对象中调用另一个方法

  29. 29

    构造函数的测试用例,因为我有一个过滤器逻辑

热门标签

归档