JUNIT测试方法无效(JUNIT testing void methods)

2019-08-31 08:31发布

我有一个Java类充满空隙的方法,我想作出一些单元测试,以获得最大的代码覆盖率。

例如,我有这样的方法:

protected static void checkifValidElements(int arg1,  int arg2) {
    method1(arg1);
    method2(arg1);
    method3(arg1, arg2);
    method4(arg1, arg2);
    method5(arg1);
    method6(arg2);
    method7();
}

它的命名不佳是有原因的,因为我翻译的代码更好的理解。 每个方法验证,如果参数都是以某种方式有效,都写得很好。

例如:

private static void method1(arg1) {
    if (arg1.indexOf("$") == -1) {

        //Add an error message 
        ErrorFile.errorMessages.add("There is a dollar sign in the specified parameter");
    }
}

我的单元测试的覆盖小方法很好,因为我要求他们检查错误文件包含错误消息,但我不知道怎样才能检验我的方法checkIfValidElements,它没有返回或改变什么。 当我运行代码覆盖率与Maven,它告诉我,单元测试doesent覆盖我的课的这一部分。

我看到的唯一方法是改变这个方法返回一个int或bollean值,如下所示:

protected static int checkifValidElements(int arg1,  int arg2) {
    method1(arg1);
    method2(arg1);
    method3(arg1, arg2);
    method4(arg1, arg2);
    method5(arg1);
    method6(arg2);
    method7();
    return 0;
}

用这种方法我能够做一个断言等于,但在我看来,这是徒劳的做到这一点。 问题是,我有几个类的被这样设计和降低我的单元测试覆盖率%。

Answer 1:

我希望做一些单元测试,以获得最大的代码覆盖率

代码覆盖率不应该编写单元测试的目标 。 你应该写单元测试来证明你的代码是正确的,或帮助你更好地设计它,或者帮助别人理解代码的意思做。

但我不知道怎样才能检验我的方法checkIfValidElements,它没有返回或改变什么。

那么你或许应该给予一些测试,在它们之间检查所有7种方法恰当地称作-既带有无效参数,并用有效的论据,检查结果ErrorFile每次。

例如,假设某人删除的呼叫:

method4(arg1, arg2);

...或意外更改的参数顺序:

method4(arg2, arg1);

你怎么会注意到这些问题? 从走,并设计测试来证明这一点。



Answer 2:

如果你的方法没有任何副作用,不返回任何东西,那么它没有做任何事情。

如果你的方法做了一些计算,并返回计算的结果,可以很明显的足够断言,返回的结果是正确的。

如果你的代码不返回任何东西,但不会有副作用,你可以调用代码,然后断言正确的副作用发生。 什么副作用是将决定你是怎么做的检查。

在你的榜样,你调用从非恢复功能,这使得它棘手的静态方法,除非你可以检查所有这些静态方法的结果是正确的。 一种更好的方式 - 从一个测试点 - 在你呼吁方法注入实际的对象。 然后,您可以使用类似的EasyMock或到的Mockito创建单元测试模拟对象,并注入模拟对象进级。 模拟对象,然后,您可以断言,正确的函数被调用,以正确的价值观,并以正确的顺序。

例如:

private ErrorFile errorFile;

public void setErrorFile(ErrorFile errorFile) {
    this.errorFile = errorFile;
}

private void method1(arg1) {
    if (arg1.indexOf("$") == -1) {

        //Add an error message 
        errorFile.addErrorMessage("There is a dollar sign in the specified parameter");
    }
}

然后在您的测试,你可以这样写:

public void testMethod1() {
    ErrorFile errorFile = EasyMock.createMock(ErrorFile.class);
    errorFile.addErrorMessage("There is a dollar sign in the specified parameter");
    EasyMock.expectLastCall(errorFile);
    EasyMock.replay(errorFile);

    ClassToTest classToTest = new ClassToTest();
    classToTest.setErrorFile(errorFile);
    classToTest.method1("a$b");

    EasyMock.verify(errorFile); // This will fail the test if the required addErrorMessage call didn't happen
}


Answer 3:

您仍然可以通过单位声称,它有相应的副作用测试无效的方法。 在你的method1例如,你的单元测试可能看起来是这样的:

public void checkIfValidElementsWithDollarSign() {
    checkIfValidElement("$",19);
    assert ErrorFile.errorMessages.contains("There is a dollar sign in the specified parameter");
}


Answer 4:

我想你应该避免编写副作用的方法。 从你的方法返回true或false,您可以在单元测试中检查这些方法。



Answer 5:

你可以学习一些所谓的“嘲笑”。 您可以使用此,例如,检查是否: - 一个函数被调用 - 一个函数被调用x次 - 一个函数被调用至少x次 - 一个函数调用一组特定的参数。 在你的情况,例如,你可以用嘲讽的检查方法3被调用一次,不管你通过为ARG1和ARG2。

看看这些: https://code.google.com/p/mockito/ https://code.google.com/p/powermock/



Answer 6:

如果你的方法是无效的,并要检查是否有异常,你可以使用expected : https://weblogs.java.net/blog/johnsmart/archive/2009/09/27/testing-exceptions-junit-47



Answer 7:

如果你的情况是可能的,你可以把你的方法method1(arg1) ... method7() 受保护的,而不是私人 ,使他们可以在同一个封装内从测试类入店。 然后,你可以简单地分别测试所有theese方法。



文章来源: JUNIT testing void methods
标签: java junit