仅在测试中执行Java代码

时间:2014-11-10 01:36:11

标签: java testing assertion

我希望在单元测试中强制执行规则,以便新代码不违反规则。但是我想在生产环境中打印出警告,以便在我清理它的时候允许生产功能。

我想知道Java是否可以以干净的方式完成上述操作? 谢谢!

3 个答案:

答案 0 :(得分:1)

我可以想到几种方法:

  1. 使用断言
  2. 使用Java系统属性仅执行测试中的代码
  3. 使用像PMD这样的静态分析工具(我认为这不适合您的情况)
  4. 使用AOP(面向方面​​编程),仅在本地测试仪器
  5. 其中大多数都不会在生产中给你警告。但他们也不会在生产中失败。

    最好的做法取决于您要检查的规则。

答案 1 :(得分:0)

你可以使用断言

断言:

断言是java中的一个语句。它可以用来测试你对程序的假设。 在执行断言时,它被认为是真的。如果失败,JVM将抛出名为AssertionError的错误。它主要用于测试目的。

断言的好处:

它提供了一种检测和纠正编程错误的有效方法。

使用断言的语法:

使用断言有两种方法。第一种方式是:

assert expression;  

,第二种方式是:

assert expression1 : expression2;  

有关详细信息,请参阅此链接:http://javarevisited.blogspot.com/2012/01/what-is-assertion-in-java-java.html

答案 2 :(得分:0)

您正在定义一个组件的两种不同行为。如果可能,定义组件以尊重这两种模式,并测试它们

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);
  }
}

通过设置两种不同的模式,并记录和测试它们,您可以为测试提供最大的灵活性来选择其预期的严格程度 - 并允许您的完全测试的可重用组件在“严格模式”中使用清理完成后立即生产。

(您也可以选择使用参数构造函数 private ,并通过静态工厂方法(如YourClass.forUnitTesting())访问它。)