是否有可以在我的java源代码中插入的单元测试注释或功能标志,以便只在运行单元测试时触发该方法?
例如:
public class A {
@Annotation
public void fooA() { }
public void fooB() { }
}
我的单元测试课程:
public class TestA {
...
}
在这种情况下,当我运行单元测试类TestA时,我想执行 fooA()和fooB()。
但如果我想运行包含classA的prod源代码,那么只会执行函数 fooB()而不会执行fooA()。
答案 0 :(得分:3)
一般情况下:不要去那里。
您的生产代码有一个责任;而且只承担一项责任:完成生产工作。您不会考虑与复杂测试相关的方面。
有时,拥有一个带有更多参数的构造函数(用于依赖注入)可能是必需的或有帮助的。然后只需要保护那个东西包,并在那里放一个非正式的“/ **单元测试* /”评论。
我的意思是:没有这样的注释。拥有一个也没有意义。您使用清晰的javadoc描述您的外部接口,您编写类以使其变得明显,用户应该只使用/调用fooB()
。
事情是:您想要发生的最后一件事是代码中的某些仅测试工件会导致生产环境出现问题。避免这种风险的最佳方法是:不要创建这样的工件。
答案 1 :(得分:0)
您可以声明您的测试包与您的被测单元(UUT)相同。
package com.example.fubar.arglebargle;
public class A {
// package-private, TEST ONLY!
void fooA() { }
public void fooB() { }
}
单元测试类:
package com.example.fubar.arglebargle;
public class TestA {
// etc...
}
我的IDE通过JUnit测试自动执行此操作。我的所有测试都在与我的UUT相同的包中声明(尽管它们显然位于完全不同的源树中;不要将测试和生产源放在同一个子目录中!)。
这对于访问一些其他内部无法使用的内部构件非常方便。它似乎也是标准做法,所以我认为没有什么可以反对的。
这不会阻止所有人调用fooA()
,但它会将潜在问题限制在与您的班级相同的程序包中的类。这是一个要担心的代码要小得多的代码,通常你可以依赖修改代码的人来仔细阅读同一个包中其他类的注释。
我认为一些测试框架可能能够访问私有方法(可能通过禁用安全管理器?)但我不知道。如果它很重要,我会研究测试框架。
答案 2 :(得分:0)
为什么在生产中应该只使用仅用于测试的代码?
1)它不验证应用程序代码,因为应用程序不使用它。
2)使用它的类的客户端容易出错。
3)使代码的可维护性和可读性变得更加困难。
例如,如果应用程序代码中没有调用者,开发人员可能想知道为什么这个方法存在。
将其视为死代码,他可以删除该方法并删除使用它的单元测试。
为了解决您的问题,我认为非生产环境中所需的这种方法应该包含在非生产环境中的应用程序包装中,但应该从生产环境中的包装中排除。
作为Maven和Gradle的工具可以很好地处理这个要求。
实际上,您不能这样做,因为该方法是生产中所需的类的一部分。因此,第一步是在特定类中提取用于测试目的的方法
通过这种方式,过滤它是可能的。