Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在测试中执行Java代码_Java_Testing_Assertion - Fatal编程技术网

仅在测试中执行Java代码

仅在测试中执行Java代码,java,testing,assertion,Java,Testing,Assertion,我想在单元测试中强制执行一条规则,这样新代码就不会违反该规则。但我只想在生产环境中打印警告,以便在我清理时,不管生产功能如何 我想知道在Java中是否有可能以一种干净的方式实现上述功能? 谢谢 我可以想出几种方法: 使用断言 使用Java系统属性仅执行测试中的代码 使用PMD之类的静态分析工具(我认为这不适合您的场景) 使用AOP(面向方面编程)和本地测试中的唯一工具 在生产过程中,大多数这些都不会给你警告。但它们的生产也不会失败 最好的做法取决于您试图检查的规则。您可以使用断言 断言: 断言是

我想在单元测试中强制执行一条规则,这样新代码就不会违反该规则。但我只想在生产环境中打印警告,以便在我清理时,不管生产功能如何

我想知道在Java中是否有可能以一种干净的方式实现上述功能?
谢谢

我可以想出几种方法:

  • 使用断言
  • 使用Java系统属性仅执行测试中的代码
  • 使用PMD之类的静态分析工具(我认为这不适合您的场景)
  • 使用AOP(面向方面编程)和本地测试中的唯一工具
  • 在生产过程中,大多数这些都不会给你警告。但它们的生产也不会失败

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

    您可以使用断言

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

    断言的优点: 它提供了一种检测和纠正编程错误的有效方法

    使用断言的语法: 有两种方法可以使用断言。第一种方法是:

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