2017-08-14 53 views
0

接近100%,我想测试的主要方法。 我只创建一个类的实例,它应该启动 应用程序。测试和代码如下所示:测试主要方法与jmockit

public class MainTest { 
    @Test 
    public void delegates_to_Launcher_instance(@Mocked Launcher launcher) { 
     String[] args = {"i"}; 
     Main.main(args); 
     new Verifications() {{ launcher.run(args); }}; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     new Launcher().run(args); 
    } 
} 

public class Launcher { 
    public void run(String[] args) { 
    } 
} 

完美地工作!

现在,Launcher类有点多余,覆盖率不是100%,因为Main的构造函数未被调用。双方可以通过从启动代码转移到主,这样痊愈:

public class MainTest { 
    @Test 
    public void delegates_to_Main_instance(@Mocked Main main) { 
     String[] args = {"i"}; 
     Main.main(args); 
     new Verifications() {{ main.run(args); }}; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     new Main().run(args); 
    } 
} 

但是当我这样做,JMockit有抱怨:

Missing invocation to: 
mmm.Main#run(["i"]) 
    on mock instance: [email protected] 

    at mmm.MainTest$1.<init>(MainTest.java:15) 
    at mmm.MainTest.delegates_to_Main_instance(MainTest.java:15) 
Caused by: Missing invocation 
    at mmm.Main.run(Main.java) 
    ... 2 more 

任何人都可以解释,这是怎么回事呢?

+0

无关:阅读Java命名约定。使用_仅适用于SOME_CONSTANTS - 但“_”不会进入方法名称! – GhostCat

+0

GhostCat的回答是正确的。我只会补充说,在这里使用嘲讽的想法很糟糕。一个好的测试验证了给定的类“A”解决了它应该解决的*有意义的业务问题*,而不是它在类“B”中调用某种方法。此外,不应编写测试以增加*代码*覆盖率,而是要增加*业务需求覆盖率*。否则,你会得到一堆不仅价值不高的测试,而且会阻止你/他人创建那些实际上很重要的测试。嘲笑只在特殊情况下才有用 - 除此之外它是有害的。 –

回答

1

这里:

public void delegates_to_Main_instance(@Mocked Main main) { 

嘲讽为主。同时你想写一个单元测试那练习那个main对象。这没有意义。你只有模拟进入你的生产代码的东西,你需要控制/验证。你做不是模拟你打算测试自己的对象!

在你的第一个例子中,你使用了一个模拟的Launcher,它被传递给被测试的类。非常有意义。在第二个例子中,你传递一个模拟实例,然后假设模拟实例是被测试的类。没有太大的意义。