【问题标题】:java test constructor with different parameters具有不同参数的java测试构造函数
【发布时间】:2015-06-27 22:56:21
【问题描述】:

我有一个带有构造函数的类,它的输入如下:

public class Project {
    public Project(Parameter1 par1, Parameter2 par2 ...) {
    //here if one incoming parameters equals null - throw exception
    }
}

问题是如何在一个测试中测试针对不同参数引发的异常?比如:

@Test
publci void testException() {
    Project project1 = new Project(null, par2 ....);//here it throws  exception and test is finished((((
//I want it to continue testing project2
    Project project2 = new Project(par1, null ...);
}

【问题讨论】:

  • 这对我来说是正确的。它给你带来了什么问题?
  • 我的班级有5个参数输入承包商。我想在一次测试中测试它们。项目 2、项目 3 等等。一开始不要停止,而是验证在所有情况下项目都会抛出异常。这就是问题所在。
  • 我不确定这是否可能。通常,您会发现需要多次测试才能完全测试一个函数。
  • 虽然您可以将每个调用包装在 try-catch 块中,但您确实不应该在一个方法中测试多个构造函数。为什么不创建多个方法,每个方法都相应命名,例如 constructWithNullParam2ShouldthrowNPE()
  • 我认为这不是一个好主意。如果我的构造函数有 100 个参数但只有一个检查 If 结构?在一个测试中测试 if 更广泛,而不是进行 100 次测试来测试同一件事。没有?

标签: java exception junit


【解决方案1】:
@Test
public void testException() {
    boolean exception1Thrown = false;
    try {
        Project project1 = new Project(null, par2 ....);
    }catch(Exception e){
        exception1Thrown = true;
    }
    assertTrue(exception1Thrown);

    boolean exception2Thrown = false;
    try {
        Project project2 = new Project(par1, null ...);
    }catch(Exception e){
        exception2Thrown = true;
    }
    assertTrue(exception2Thrown);

}

这只是几种方法之一。更多信息请见this question

【讨论】:

    【解决方案2】:

    Project1 = new Project(....Project2 = new Project(..... 保留在各自的try catch 块中。通过第一个块抛出的异常不会停止后面的代码部分运行。

    【讨论】:

      【解决方案3】:

      您可以将标志 (shouldThrowException) 作为测试参数之一传递。但更清洁的方法是进行两次测试。一种用于正确的参数,一种用于错误的参数。我会这样做:

      import static org.assertj.core.api.Assertions.assertThatThrownBy;
      import org.junit.runner.RunWith;
      import com.googlecode.zohhak.api.Coercion;
      import com.googlecode.zohhak.api.TestWith;
      import com.googlecode.zohhak.api.runners.ZohhakRunner;
      
      @RunWith(ZohhakRunner.class)
      public class MyTest {
      
        @TestWith({
              "parameter1,      parameter2",
              "otherParameter1, otherParameter2" 
        })
        public void should_construct_project(Parameter parameter1, Parameter parameter2) {
          new Project(parameter1, parameter2);
        }
      
        @TestWith({
              "null,            parameter2",
              "otherParameter1, null",
              "badParameter1,   goodParameter2"
        })
        public void should_fail_constructing_project(Parameter parameter1, Parameter parameter2) {
      
          assertThatThrownBy(() -> new Project(parameter1, parameter2))
                                          .isInstanceOf(NullPointerException.class);          
        }
      
        @Coercion
        public Parameter toParameter(String input) {
          return new Parameter(...);
        }
      }
      

      如果您想测试所有可能的参数组合,那么数据提供者或理论可能会很有用。

      【讨论】:

        【解决方案4】:

        您可以使用https://github.com/Pragmatists/JUnitParams 来执行此操作:

        假设您有一个 Person 对象,必须指定所有参数,然后您可以使用 JUnitParams 以这种方式进行测试:

        @Test(expected = IllegalArgumentException.class)
            @Parameters(
            {", bloggs, joe.bloggs@ig.com",
            "joe, , joe.bloggs@ig.com,",
            "joe, bloggs, ,",
        )
        public void allParametersAreMandatory(String firstName, String lastName, String emailAddress)
        {
           new Person(firstName, lastName, emailAddress);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 2018-03-01
          • 2014-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多