我有一个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;
}
用这种方法我能够做一个断言等于,但在我看来,这是徒劳的做到这一点。 问题是,我有几个类的被这样设计和降低我的单元测试覆盖率%。
我希望做一些单元测试,以获得最大的代码覆盖率
代码覆盖率不应该编写单元测试的目标 。 你应该写单元测试来证明你的代码是正确的,或帮助你更好地设计它,或者帮助别人理解代码的意思做。
但我不知道怎样才能检验我的方法checkIfValidElements,它没有返回或改变什么。
那么你或许应该给予一些测试,在它们之间检查所有7种方法恰当地称作-既带有无效参数,并用有效的论据,检查结果ErrorFile
每次。
例如,假设某人删除的呼叫:
method4(arg1, arg2);
...或意外更改的参数顺序:
method4(arg2, arg1);
你怎么会注意到这些问题? 从走,并设计测试来证明这一点。
如果你的方法没有任何副作用,不返回任何东西,那么它没有做任何事情。
如果你的方法做了一些计算,并返回计算的结果,可以很明显的足够断言,返回的结果是正确的。
如果你的代码不返回任何东西,但不会有副作用,你可以调用代码,然后断言正确的副作用发生。 什么副作用是将决定你是怎么做的检查。
在你的榜样,你调用从非恢复功能,这使得它棘手的静态方法,除非你可以检查所有这些静态方法的结果是正确的。 一种更好的方式 - 从一个测试点 - 在你呼吁方法注入实际的对象。 然后,您可以使用类似的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
}
您仍然可以通过单位声称,它有相应的副作用测试无效的方法。 在你的method1
例如,你的单元测试可能看起来是这样的:
public void checkIfValidElementsWithDollarSign() {
checkIfValidElement("$",19);
assert ErrorFile.errorMessages.contains("There is a dollar sign in the specified parameter");
}
我想你应该避免编写副作用的方法。 从你的方法返回true或false,您可以在单元测试中检查这些方法。
你可以学习一些所谓的“嘲笑”。 您可以使用此,例如,检查是否: - 一个函数被调用 - 一个函数被调用x次 - 一个函数被调用至少x次 - 一个函数调用一组特定的参数。 在你的情况,例如,你可以用嘲讽的检查方法3被调用一次,不管你通过为ARG1和ARG2。
看看这些: https://code.google.com/p/mockito/ https://code.google.com/p/powermock/
如果你的方法是无效的,并要检查是否有异常,你可以使用expected
: https://weblogs.java.net/blog/johnsmart/archive/2009/09/27/testing-exceptions-junit-47
如果你的情况是可能的,你可以把你的方法method1(arg1)
... method7()
受保护的,而不是私人 ,使他们可以在同一个封装内从测试类入店。 然后,你可以简单地分别测试所有theese方法。