仅在测试中执行Java代码
我想在单元测试中强制执行一条规则,这样新代码就不会违反该规则。但我只想在生产环境中打印警告,以便在我清理时,不管生产功能如何 我想知道在Java中是否有可能以一种干净的方式实现上述功能?仅在测试中执行Java代码,java,testing,assertion,Java,Testing,Assertion,我想在单元测试中强制执行一条规则,这样新代码就不会违反该规则。但我只想在生产环境中打印警告,以便在我清理时,不管生产功能如何 我想知道在Java中是否有可能以一种干净的方式实现上述功能? 谢谢 我可以想出几种方法: 使用断言 使用Java系统属性仅执行测试中的代码 使用PMD之类的静态分析工具(我认为这不适合您的场景) 使用AOP(面向方面编程)和本地测试中的唯一工具 在生产过程中,大多数这些都不会给你警告。但它们的生产也不会失败 最好的做法取决于您试图检查的规则。您可以使用断言 断言: 断言是
谢谢 我可以想出几种方法:
assert expression;
第二种方法是:
assert expression1 : expression2;
有关更多信息,请参阅此链接:您正在定义一个组件的两种不同行为。如果可能,请定义组件以符合这两种模式,并对其进行测试 通过设置两种不同的模式,并记录和测试它们,您可以为测试提供最大的灵活性,以选择其预期的严格级别,并允许在清理完成后立即在生产中以“严格模式”使用经过充分测试的可重用组件
(您也可以选择将参数设为私有构造函数,并通过静态工厂方法(如
YourClass.forUnitTesting()
)将其访问)这要求您在生产中禁用断言,对吗?我认为它当前已启用,并且对于生产检查也是一个非常有用的功能。您指的是什么系统属性?任何系统属性。您可以使用System.setProperty(“myProperty”、“myValue”)创建一个(在Java中)成为您想要的任何内容。然后测试和代码可以查找相同的一个。
class YourClass {
private final boolean strictMode;
YourClass() {
this(false); // strict mode off by default
}
YourClass(boolean strictMode) {
this.strictMode = strictMode;
}
void yourMethod(Object parameter) {
if (parameter == null) {
if (strictMode)
throw new IllegalArgumentException();
else
System.err.println("YourClass.yourMethod parameter is null!")
}
}
}
class YourClassTest {
@Test public void yourMethodNonStrictModeShouldAllowNull() {
YourClass yourClass = new YourClass(false);
yourClass.yourMethod(null);
}
@Test(exception=IllegalArgumentException.class)
public void yourMethodStrictModeShouldThrowException() {
YourClass yourClass = new YourClass(false);
yourClass.yourMethod(null);
}
}