Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 Junit用于循环执行计数_Java_Junit_Junit4 - Fatal编程技术网

Java Junit用于循环执行计数

Java Junit用于循环执行计数,java,junit,junit4,Java,Junit,Junit4,我需要运行给定次数的代码。我想知道如何对这个循环进行单元测试 public void executeCode(int iterations){ for (int i = 0; i < iterations; i++) try { callToCode(parms...); } catch(Exception e) { // handle exception i--; } } pu

我需要运行给定次数的代码。我想知道如何对这个循环进行单元测试

public void executeCode(int iterations){

  for (int i = 0; i < iterations; i++)
      try {
           callToCode(parms...);
      } catch(Exception e) {
           // handle exception 
           i--;
      }
}
public void executeCode(int迭代){
对于(int i=0;i
callToCode此方法具有100%的行覆盖率,但它的一个要求是在给定的迭代次数下执行此方法

我可以使用实例变量来跟踪执行,但对这种循环进行单元测试的最佳方法是什么


我只能使用Junit而不能使用其他库

如果可以,重构代码以将依赖项调用建模为对注入成员的调用

public void executeCode(int iterations, Callable callable) {
  for (int i = 0; i < iterations; i++)
      try {
         callable.call();
      } catch(Exception e) {
         // handle exception 
         i--;
      }
然后再次在JUnit中,您可以注入一个计算调用的不同类

最后,如果调用代码(parms…);是类中的另一个方法,也可以重写它以计数,如下所示:

public class MyClassTest {
    @Test
    public void testCountLoop() {
        MyClass class = new MyClass() {
            int calls;
            @Override
            public void callToCode(parms...) {
                calls++;
            }
        }
        // ... run and assert calls
    }
}

我会将callToCode提取到另一个类,如

public class Caller{
    public void callToCode(String someparam){//Some logic}
} 
然后,您的循环将位于另一个类中,在构造函数中具有依赖项:

 public class OuterClass {
    Caller caller;
    public OuterClass(Caller caller){
        this.caller = caller;
    }
    public void executeCode(int iterations){

      for (int i = 0; i < iterations; i++)
         try {
              caller.callToCode(parms...);
         } catch(Exception e) {
              // handle exception 
              i--;
         }
      }
}

使用ArgumentCaptor,您还可以验证方法调用的参数。大多数情况下,如果您不能正确地对代码进行单元测试,这是一个设计问题。通过分离代码的不同抽象级别,您可以分别测试每个级别,您将获得更清晰、可读的解决方案。

使用Mockito并检查是否调用了该方法。Mockito允许您测试行为,JUnit允许您测试状态。我应该提到,在问题中,很明显,当你在异常中减少
I
时,你的方法总是在给定的迭代次数下成功执行。但这可能需要无限长的时间。“处理异常”是否有需要JUnit覆盖的代码?如果可以使用JUnit 5,参数化测试可以做到这一点:
 public class OuterClass {
    Caller caller;
    public OuterClass(Caller caller){
        this.caller = caller;
    }
    public void executeCode(int iterations){

      for (int i = 0; i < iterations; i++)
         try {
              caller.callToCode(parms...);
         } catch(Exception e) {
              // handle exception 
              i--;
         }
      }
}
public class Test{
    OuterClass target = ...

    Caller mockeCaller = Mockito.mock(Caller.class);

    @Test
    public void test(){
       Mockito.verify(mockCaller, Mockito.times(2)).callToCode(Mockito.any());
    } 
}