andrewzhou
V2EX  ›  Java

[java] 求助

  •  
  •   andrewzhou · Sep 20, 2016 · 3708 views
    This topic created in 3560 days ago, the information mentioned may be changed or developed.

    class A{ private M m = SomeObjectGetfromSingleton; }

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

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

    7 replies    2016-09-21 08:58:31 +08:00
    chocotan
        1
    chocotan  
       Sep 20, 2016
    为啥会不知道怎么 Mock m ?
    两种无非是初始化顺序不同
    andrewzhou
        2
    andrewzhou  
    OP
       Sep 20, 2016
    @chocotan m 是一个私有的从单例 (单例使用 enum 实现的)中拿到的对象, 现在我还没弄明白怎么 Mock , 1 ) Mock 单例 2 ) Mock m 但是现有代码是第一种写法不知道怎么 Mock A 是被测试类,需要部分 Mock 。
    chocotan
        3
    chocotan  
       Sep 20, 2016
    m = Mockito.spy(m);
    Mockito.doReturn(xxx).when(m).someMethod(anyParam);
    frienmo
        4
    frienmo  
       Sep 20, 2016
    知识有限,尝试回答第二个
    不等效。
    第一个等效于 M m; { m = GetXXX} 是 initialization block
    所以和第二个在构造类中的执行顺序有区别。
    dreamworldcn
        5
    dreamworldcn  
       Sep 20, 2016
    抛砖引玉,目前的解决思路是额外增加一个构造器用于单元测试。
    比如
    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  
       Sep 21, 2016
    两种写法都不利于单元测试,最好的是用 constructor injection 的方式把 m 注入进来
    andrewzhou
        7
    andrewzhou  
    OP
       Sep 21, 2016
    感谢 各位 但是我对 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();这种
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2562 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 08:01 · PVG 16:01 · LAX 01:01 · JFK 04:01
    ♥ Do have faith in what you're doing.