V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
andrewzhou
V2EX  ›  Java

[java] 求助

  •  
  •   andrewzhou · 2016-09-20 11:18:57 +08:00 · 2668 次点击
    这是一个创建于 2746 天前的主题,其中的信息可能已经有所发展或是发生改变。

    class A{ private M m = SomeObjectGetfromSingleton; }

    另外一种写法 class A{ private M m ; public A() { m= SomeObjectGetfromSingleton; } }

    1 )现在代码中是用的第一种写法,测试的时候因为这种方式的存在不知道怎么 Mock m 。 2 )上面两种写法等效吗?

    7 条回复    2016-09-21 08:58:31 +08:00
    chocotan
        1
    chocotan  
       2016-09-20 11:32:53 +08:00
    为啥会不知道怎么 Mock m ?
    两种无非是初始化顺序不同
    andrewzhou
        2
    andrewzhou  
    OP
       2016-09-20 13:49:57 +08:00
    @chocotan m 是一个私有的从单例 (单例使用 enum 实现的)中拿到的对象, 现在我还没弄明白怎么 Mock , 1 ) Mock 单例 2 ) Mock m 但是现有代码是第一种写法不知道怎么 Mock A 是被测试类,需要部分 Mock 。
    chocotan
        3
    chocotan  
       2016-09-20 16:14:40 +08:00
    m = Mockito.spy(m);
    Mockito.doReturn(xxx).when(m).someMethod(anyParam);
    frienmo
        4
    frienmo  
       2016-09-20 17:16:30 +08:00
    知识有限,尝试回答第二个
    不等效。
    第一个等效于 M m; { m = GetXXX} 是 initialization block
    所以和第二个在构造类中的执行顺序有区别。
    dreamworldcn
        5
    dreamworldcn  
       2016-09-20 22:25:46 +08:00
    抛砖引玉,目前的解决思路是额外增加一个构造器用于单元测试。
    比如
    public class A {
    private IService service;

    public A() {
    this.service = getServiceFromSingleton();
    }

    public A(IService s) { //用于单元测试的构造器
    this.service = s;
    }
    }

    这样单元测试的时候,使用用于单元测试的构造器,就可以给类 A 提供 mock 的 IService 。
    以后引入 DI 框架,也可以利用这样的构造器做注入。
    georgema1982
        6
    georgema1982  
       2016-09-21 04:33:41 +08:00
    两种写法都不利于单元测试,最好的是用 constructor injection 的方式把 m 注入进来
    andrewzhou
        7
    andrewzhou  
    OP
       2016-09-21 08:58:31 +08:00
    感谢 各位 但是我对 java 不熟
    想在的代码是
    class A{ private M m = SomeObjectGetfromSingleton; }
    如果代码改变为
    class A{ private M m; public A(){m = SomeObjectGetfromSingleton();} public A(M x){ m= x; } }
    不确认正常非测试的时候调用是不是有细微的差别 A a = new A();这种
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2426 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:09 · PVG 00:09 · LAX 09:09 · JFK 12:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.